2011-02-18 97 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);