using System.Linq.Expressions;
private static Func<somestructone, Delegate, somestructone> cachedSetter;
public delegate void somedelegate(int somevariable);
public static void somefunction(int somevariable)
Console.WriteLine("somevalue: {0}", somevariable);
public struct somestructone
public somedelegate somedelegate;
public static void Main(string[] args)
if (cachedSetter == null)
cachedSetter = GenerateFieldSetter();
var @delegate = Delegate.CreateDelegate(typeof(somedelegate), typeof(someclass).GetMethod("somefunction"));
var structone = new somestructone();
structone = cachedSetter(structone, @delegate);
Console.WriteLine(structone.somedelegate == null);
public static Func<somestructone, Delegate, somestructone> GenerateFieldSetter()
var field = typeof(somestructone).GetField("somedelegate");
var delegateParameter = Expression.Parameter(typeof(Delegate), "delegate");
var structParameter = Expression.Parameter(typeof(somestructone), "struct");
var setExpression = Expression.Assign(Expression.Field(structParameter, field), Expression.Convert(delegateParameter, typeof(somedelegate)));
var block = Expression.Block(setExpression, structParameter);
return Expression.Lambda<Func<somestructone, Delegate, somestructone>>(block, structParameter, delegateParameter).Compile();