c# - 当我只有泛型类型和实例值时,如何手动构建表达式树?

标签 c# dynamic lambda expression expression-trees

我有一个如下所示的通用类:

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/

相关文章:

c# - 用 lambda 表达式替换委托(delegate)

python - 如何对这个 lambda 代码进行单元测试?

c# - asp.net mvc time ago in words helper

c# - 如何在一个 WinForms 应用程序中同时运行多个表单?

c - 该函数仅适用于无用的 printf

c - 何时使用静态数组与动态数组 C

ruby - 如何动态定义一个引用外部局部变量的类方法?

c# - 规范流: "Step bindings are still being analyzed. Please wait."

c# - 如何理解这个任务需要什么

lambda - 您可以使用 Lambda 在通过 Cloudformation 创建的 RDS 上创建架构吗?