我正在尝试获取一个获取属性名称的简单表达示例。这是一个简单的教程,让我自己绕过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/作为教程/参考,但我绝对不理解。
答案 0 :(得分:2)
首先,System.Func<object,object>
表示你的lambda表达式接受一个object类型的参数并返回一个对象,所以你将得到一个像(arg) => test.PropertyName
这样的表达式。如果您不想输入参数,请使用System.Func<object>
。
其次,您没有在Intellisense中看到您的GetPropertyName方法,因为Main是static
方法。创建一个Program对象的实例并从那里调用它,或者也将GetPropertyName声明为static
。