动态创建表达式树

本文关键字:表达式 创建 动态 | 更新日期: 2023-09-27 18:04:36

我有一个想法,想知道它是否可以工作。我有一个简单的类与属性,并希望与表达式生成访问器。但最后我需要一个Func<Test, string>,但我不知道使用它们的类型。一个小例子

class Program
{
    static void Main(string[] args)
    {
        Test test = new Test();
        test.TestString = "Blubb";
        var actionStub = typeof(Helper).GetMethod("CreatePropertyGetter").MakeGenericMethod(new Type[] { test.GetType(), typeof(string)});
        dynamic action = actionStub.Invoke(null, new object[] {test.GetType(), "TestString"});
        var x = action(test);
    }
}
public class Test
{
    public string TestString { get; set; }
}
public static class Helper
{
    public static Func<TType, TPropValueType> CreatePropertyGetter<TType, TPropValueType>(Type type,
                                                                                  string propertyName)
    {
        PropertyInfo fieldInfo = type.GetProperty(propertyName);
        ParameterExpression targetExp = Expression.Parameter(typeof(TType), "target");
        MemberExpression fieldExp = Expression.Property(targetExp, fieldInfo);
        UnaryExpression assignExp = Expression.Convert(fieldExp, typeof(TPropValueType));
        Func<TType, TPropValueType> getter =
            Expression.Lambda<Func<TType, TPropValueType>>(assignExp, targetExp).Compile();
        return getter;
    }
}

问题是我不能调用表达式没有动态,因为我不能简单地将其转换为Func<object, object>

动态创建表达式树

您正在生成(TType target) => target.Something。相反,生成(object target) => (object)((TType)target).Something以便您可以使用Func<object, object>

不清楚你到底在要求什么,但这里有一个例子,你可以使它Func<object, object>:

public static class Helper
{
    public static Func<object, object> CreatePropertyGetter(Type type, string propertyName)
    {
        var fieldInfo = type.GetProperty(propertyName);
        var targetExp = Expression.Parameter(typeof(object), "target");
        var fieldExp = Expression.Property(Expression.ConvertChecked(targetExp, type), fieldInfo);
        var getter = Expression.Lambda<Func<object, object>>(fieldExp,targetExp).Compile();
        return getter;
    }
}