在c#中使用表达式缠绕我的头部时遇到问题

时间:2011-04-14 18:59:17

标签: c# expression-trees

我正在尝试获取一个获取属性名称的简单表达示例。这是一个简单的教程,让我自己绕过C#表达式。

我有以下代码:

public class TestClass
{
    public string TestProperty { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        TestClass test = new TestClass();
        string name = GetPropertyName(() => test.TestProperty);

        Console.WriteLine("Property name is: ");
        Console.ReadLine();
    }

    public string GetPropertyName(Expression<Func<object, object>> expression)
    {
        var memberExp = expression.Body as MemberExpression;
        if (memberExp == null)
            throw new InvalidOperationException("Not a member expression");

        return memberExp.Member.Name;
    }
}

这会产生两个问题:

1)什么是馅饼打字string name = GetPropertyName智能感知实际上并没有显示我的GetPropertyName()方法。

2)() => test.TestProperty给出Delegate 'System.Func<object,object>' does not take 0 arguments

的编译错误

我一直在尝试使用http://marlongrech.wordpress.com/2008/01/08/working-with-expression-trees-part-1/http://jagregory.com/writings/introduction-to-static-reflection/作为教程/参考,但我绝对不理解。

1 个答案:

答案 0 :(得分:2)

首先,System.Func<object,object>表示你的lambda表达式接受一个object类型的参数并返回一个对象,所以你将得到一个像(arg) => test.PropertyName这样的表达式。如果您不想输入参数,请使用System.Func<object>

其次,您没有在Intellisense中看到您的GetPropertyName方法,因为Main是static方法。创建一个Program对象的实例并从那里调用它,或者也将GetPropertyName声明为static