2011-02-18 95 views

回答

4

这是一个Expression<Func<string>>,所以你可以有:

void Foo(Expression<Func<string>> selector) {...} 

void Foo<T>(Expression<Func<T>> selector) {...} 

但是,请注意语法MyClass.Name静态财产;如果你想要一个实例属性,你可能需要的东西更像是一个Expression<Func<MyClass,string>> - 例如:

static void Foo<TSource, TValue>(
    Expression<Func<TSource, TValue>> selector) 
{ 

} 
static void Main() { 
    Foo((MyClass obj) => obj.Name);   
} 

至于执行; 在这个简单的例子,我们可以期待Body是一个MemberExpression,所以:

static void Foo<TSource, TValue>(
    Expression<Func<TSource, TValue>> selector) 
{ 
    var member = ((MemberExpression)selector.Body).Member; 
    Console.WriteLine(member.ReflectedType.Name + "." + member.Name); 
} 

然而,在一般情况下更为复杂。

static void Foo<TValue>(
    Expression<Func<TValue>> selector) 
{ 
    var member = ((MemberExpression)selector.Body).Member; 
    Console.WriteLine(member.ReflectedType.Name + "." + member.Name); 
} 
+0

`美孚((MyClass的OBJ) => obj.Name)`是我在找的东西。谢谢。 – jgauffin 2011-02-18 11:36:25

1

这取决于Name是静态的属性:如果我们使用静态成员这也将正常工作。
1.如果它不是静态的,那么MyClass.Name根本就不是一个有效的语法。因此,让我们假设,在这种情况下,你想从本地变量使用这样得到class+property

var instance = new MyClass(); 
string result = GetClassAndPropertyName(() => instance.Name); 

所以对于GetClassAndPropertyName的实施应该是这样的:

public static string GetClassAndPropertyName<T>(Expression<Func<T>> e) 
{ 
    MemberExpression memberExpression = (MemberExpression) e.Body; 
    return memberExpression.Member.DeclaringType.Name + "." + memberExpression.Member.Name; 
} 

另一种语法,你可以在Marc的发现回答。

2. Name财产也可以是静态的,这是不可能在我的意见,但它可以让下面的语法,这是确切的语法,你已经问:

string result = GetClassAndPropertyName(() => MyClass.Name);