c# - 带有表达式树的复杂构建器方法

标签 c# .net linq expression-trees

假设我必须在运行时创建以下方法

Type someType = ...; // assigned somewhere

var method = (presenter) => 
{
    var instance = new SomeType(); // I've only default constructor here
    instance.SomeProperty = presenter;
    return instance;
}

有人知道如何使用表达式树在运行时创建这样的方法吗?

最佳答案

这里的关键是使用Expression.Block来获取多语句lambda。您可以使用类似以下内容:

void Main()
{
    var p = Expression.Parameter(typeof(int), "presenter");
    var instance = Expression.Variable(typeof(Foo), "instance");
    var ctor = typeof(Foo).GetConstructor(new Type[0]);
    var block = Expression.Block(new [] { instance },
        Expression.Assign(instance, Expression.New(ctor)),
        Expression.Assign(Expression.Property(instance, "SomeProperty"), p),
        instance
    );

    var lambda = Expression.Lambda<Func<int,Foo>>(block, p);
    Foo f = lambda.Compile()(5);
    Console.WriteLine(f.SomeProperty);
}

class Foo 
{
    public int SomeProperty {get;set;}
}

当然,您需要对其进行调整以满足您的需求,哪些部分是可变的,哪些部分不是,等等,但它演示了总体思路。

关于c# - 带有表达式树的复杂构建器方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11441191/

相关文章:

c# - 获取网页中所有 url 的列表

c# - 如何在 C# 中将 UTF-16 字符存储为字符串?

命令行/脚本/解释环境中的 C# 或 Java?

c# - 在 C# 中的位置拆分字符串

c# - BackgroundWorker 在 VSTO 中不工作

.net - 有什么办法可以在基本的T4模板中提供功能吗?

.net - XML 到 .NET 类

c# - 检查两个列表是否有相同的项目

c# 使用 linq 替换类的属性中的字符串不起作用

c# - 通过指定多个条件在通用列表中查找项目