微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 对表达式树使用lambda返回值

我试着用表达树玩一下.
我有一个List< string>的对象我想构建一个表达式树,为这个属性添加一个值,但我想指定要通过Func添加的值.
目前我试试这个……

public static Action<T> CreateMethodAddobjectToList<T,C>(this Type type,string property,Func<C> ctorFunction)
        {
            PropertyInfo fieldInfo = type.GetProperty(property);

            if (fieldInfo == null)
            {
                return null;
            }

            ParameterExpression targetExp = Expression.Parameter(type,"target");
            MemberExpression fieldExp = Expression.Property(targetExp,property);
            var method = fieldExp.Type.getmethod("Add",BindingFlags.Public | BindingFlags.Instance);

            Expression<Func<C>> ctorExpression = () => ctorFunction();

// but this doesnt work because I can't use the ctorExpression in this way
            var callExp = Expression.Call(fieldExp,method,ctorExpression);

            var function = Expression.Lambda<Action<T>>(callExp,targetExp).Compile();

            return function;
        }

电话看起来像

var dummyObject = new DummyObject { IntProperty = 5 };

            Action<DummyObject> setter = typeof (DummyObject).CreateMethodAddobjectToList<DummyObject,string>("StringList",() => "Test" );

解决方法

您可以将ctorFunction更改为Expression< Func< C>>然后在生成的操作中调用它:

public static Action<T> CreateMethodAddobjectToList<T,Expression<Func<C>> createExpr)
{
    PropertyInfo fieldInfo = type.GetProperty(property);

    if (fieldInfo == null)
    {
        return null;
    }

    ParameterExpression targetExp = Expression.Parameter(type,"target");
    MemberExpression fieldExp = Expression.Property(targetExp,property);
    var method = fieldExp.Type.getmethod("Add",BindingFlags.Public | BindingFlags.Instance);

    var valueExpr = Expression.Invoke(createExpr);
    var callExpr = Expression.Call(fieldExp,valueExpr);

    var function = Expression.Lambda<Action<T>>(callExpr,targetExp).Compile();

    return function;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐