我有一个如下所示的通用类:
public class MyClass<T, TProperty>
{
MyClass(Expression<Func<T, TProperty>> expression)
{
}
}
就我而言,我想使用 Activator 动态创建该类的实例。所以我需要的是为构造函数创建一个表达式。我拥有的是类型 (System.Type) 和对象 (System.Object),我想要如下所示的内容:
Expression<Func<T, TProperty>> exp = x => someValue;
“someValue”被声明为对象,但它的实际类型肯定是TProperty。它是通过反射解析的,所以这里的类型是object。
问题是类型 T 和 TProperty 将是通用的,我直到运行时才知道类型,所以我无法将“someValue”转换为 TProperty。我们拥有的是 typeof(T)、typeof(TProperty) 和一个对象 -,-
最佳答案
好的,我想我明白这个问题了。
给定示例输入:
Type typeOfT = typeof(int);
Type typeOfTProperty = typeof(string);
object someValue = "Test";
您想要创建相当于以下内容的代码:
var myClassInstance = new MyClass<int, string>(t => "Test");
以下是您可以做到这一点的方法。
首先,创建表达式树:
var parameter = Expression.Parameter(typeOfT, "t");
var body = Expression.Constant(someValue, typeOfTProperty);
// Will automatically be an Expression<Func<T, TProperty>> without any extra effort.
var lambda = Expression.Lambda(body, parameter);
然后使用反射创建MyClass<T, TProperty>
实例:
var myClassType = typeof(MyClass<,>).MakeGenericType(typeOfT, typeOfTProperty);
// Make the MyClass<,> constructor public first...
var myClassInstance = Activator.CreateInstance(myClassType, lambda);
关于c# - 当我只有泛型类型和实例值时,如何手动构建表达式树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8366950/