using System.Linq.Expressions;
public static void Main()
typeof(S).GetField("I").SetValue(s, 1);
Console.WriteLine(((S)s).I);
Action<object, object> setter = CreateSetter(typeof(S), typeof(S).GetField("I"));
Console.WriteLine(((S)s).I);
public static Action<object, object> CreateSetter(Type type, FieldInfo field)
ParameterExpression targetExp = Expression.Parameter(typeof(object), "target");
ParameterExpression valueExp = Expression.Parameter(typeof(object), "value");
Expression castTartgetExp = type.IsValueType
? Expression.Unbox(targetExp, type)
: Expression.Convert(targetExp, type);
Expression castValueExp = Expression.Convert(valueExp, field.FieldType);
MemberExpression fieldExp = Expression.Field(castTartgetExp, field);
BinaryExpression assignExp = Expression.Assign(fieldExp, castValueExp);
return Expression.Lambda<Action<object, object>>(assignExp, targetExp, valueExp).Compile();