在表达式树中引用“this”

时间:2012-08-19 11:08:52

标签: c# expression-trees

我正在尝试使用C#中的表达式树,并且只是遇到了一些看似简单的东西,但这也是不可谷歌的。如何创建引用this的表达式? Expression.PropertyOrField(..., "this")抛出异常“'this'不是[...]类型的成员。”

Expression类有很多方法,但在这种情况下似乎都不适用,而且这不是一个搜索友好的问题......

2 个答案:

答案 0 :(得分:2)

好像你需要Expression.Constant()方法。例如,您可以使用如下表达式调用类方法:

class Foo
{
    public void Test()
    {
        var instance = Expression.Constant(this);
        var body = Expression.Call(instance, GetType().GetMethod("ToString"));
        var exp = Expression.Lambda<Func<string>>(body);
        Console.WriteLine(exp.Compile()());
    }
}

或访问实例属性:

class Foo
{
    public string TestProperty
    {
        get { return "It works."; }
    }

    public void Test()
    {
        var instance = Expression.Constant(this);
        var body = Expression.Property(instance, "TestProperty");
        var exp = Expression.Lambda<Func<string>>(body);
        Console.WriteLine(exp.Compile()());
    }
}

答案 1 :(得分:1)

您的示例代码中的

this”等于...。您已经拥有对象引用。没有名为this的隐藏成员。

this在概念上仅在实例方法的主体中有意义。