【问题标题】:Set field value with Expression tree使用表达式树设置字段值
【发布时间】:2016-05-12 13:47:51
【问题描述】:

我需要为类中的所有字段创建一个表达式。 所以我采用了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&lt;Action&lt;T,object&gt;&gt;(..),因为该字段可以是例如字符串,我得到一个例外。 我尝试将Expression.Convert 集成到我的 sn-p 中,但不知道如何实现它。

我需要如何将转换部分集成到我的代码中?

【问题讨论】:

  • 你能展示你正在尝试构建的整个方法(包括签名)吗?
  • @IvanStoev 更新代码:这基本上是(简化的)我想做的。感谢您的支持。
  • 我明白了。那么答案应该对你有用,我将删除第一句话。
  • @IvanStoev 感谢您的帮助。完美运行:)

标签: c# .net expression-trees


【解决方案1】:

Expression&lt;Action&lt;T, object&gt;&gt; 表示第二个参数的类型应该是object,而您的代码使用的是propertyType。应该是这样的:

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();

}

【讨论】:

    猜你喜欢
    • 2010-09-24
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多