编程语言
首页 > 编程语言> > c#-使用表达式树设置字段值

c#-使用表达式树设置字段值

作者:互联网

我需要为一个类中的所有字段创建一个表达式.
因此,我已根据需要采用了this post

public static void Sample()
{
    var setters = GetFieldSetterExpressions<Account>();
    var myAccount = new Account();
    setters["AccounHolder"](myAccount, "Giovanni");
    setters["Pin"](myAccount, 123);
}

public static Dictionary<string, Action<T, object>> GetFieldSetterExpressions<T>() where T: class 
{

    var dic = new Dictionary<string,Action<T,object>>();

    var type = typeof(T);
    var fields = type.GetFields();
    foreach (var fieldInfo in fields)
    {
        Type fieldType;

        if (IsNullableType(fieldInfo.FieldType))
            fieldType = Nullable.GetUnderlyingType(fieldInfo.FieldType);
        else
            fieldType = fieldInfo.FieldType;


        ParameterExpression targetExp = Expression.Parameter(type, "target");
        ParameterExpression valueExp = Expression.Parameter(fieldType, "value");

        MemberExpression fieldExp = Expression.Field(targetExp, fieldInfo);
        BinaryExpression assingExp = Expression.Assign(fieldExp, valueExp);

        var setter = Expression.Lambda<Action<T, object>>(assingExp, targetExp, valueExp).Compile();

        dic.Add(fieldInfo.Name, setter);
    }

    return dic;
}

我的问题是Expression.Lambda< Action< T,object>>(..),因为该字段可以是例如字符串,所以我得到了一个例外.
我试图将Expression.Convert转换为我的代码段,但不知道如何实现它.

我该如何在我的代码中集成转换部分?

解决方法:

表达式< Action< T,对象>表示当您的代码使用propertyType时,第二个参数应为object类型.应该是这样的:

var type = typeof(T);
var fields = type.GetFields();
foreach (var fieldInfo in fields)
{
    var targetExp = Expression.Parameter(type, "target");
    var valueExp = Expression.Parameter(typeof(object), "value");

    var fieldExp = Expression.Field(targetExp, fieldInfo);
    var assignExp = Expression.Assign(fieldExp, Expression.Convert(valueExp, fieldExp.Type));

    var setter = Expression.Lambda<Action<T, object>>(assignExp, targetExp, valueExp).Compile();

}

标签:c,net,expression-trees
来源: https://codeday.me/bug/20191118/2029925.html