How do I set a field value in an C# Expression tree?

后端 未结 6 605
野趣味
野趣味 2020-12-02 08:16

Given:

FieldInfo field = ;
ParameterExpression targetExp = Expression.Parameter(typeof(T), \"target\");
ParameterExp         


        
6条回答
  •  死守一世寂寞
    2020-12-02 08:54

    private static Action CreateSetAccessor(FieldInfo field)
        {
            DynamicMethod setMethod = new DynamicMethod(field.Name, typeof(void), new[] { typeof(object), typeof(object) });
            ILGenerator generator = setMethod.GetILGenerator();
            LocalBuilder local = generator.DeclareLocal(field.DeclaringType);
            generator.Emit(OpCodes.Ldarg_0);
            if (field.DeclaringType.IsValueType)
            {
                generator.Emit(OpCodes.Unbox_Any, field.DeclaringType);
                generator.Emit(OpCodes.Stloc_0, local);
                generator.Emit(OpCodes.Ldloca_S, local);
            }
            else
            {
                generator.Emit(OpCodes.Castclass, field.DeclaringType);
                generator.Emit(OpCodes.Stloc_0, local);
                generator.Emit(OpCodes.Ldloc_0, local);
            }
            generator.Emit(OpCodes.Ldarg_1);
            if (field.FieldType.IsValueType)
            {
                generator.Emit(OpCodes.Unbox_Any, field.FieldType);
            }
            else
            {
                generator.Emit(OpCodes.Castclass, field.FieldType);
            }
            generator.Emit(OpCodes.Stfld, field);
            generator.Emit(OpCodes.Ret);
            return (Action)setMethod.CreateDelegate(typeof(Action));
        }
    

提交回复
热议问题