2010-11-04 275 views

回答

5

你問這是否可能?

public void PrintPropertyName(int value) { 
    Console.WriteLine(someMagicCodeThatPrintsThePropertyName); 
} 

// x is SomeClass having a property named SomeNumber 
PrintInteger(x => x.SomeNumber); 

和「SomeNumber」將被打印到控制檯上?

如果是這樣,沒有。這顯然是不可能的(提示:PrintPropertyName(5)會發生什麼?)。但是,你可以這樣做:

public static string GetPropertyName<TSource, TProperty>(this Expression<Func<TSource, TProperty>> expression) { 
    Contract.Requires<ArgumentNullException>(expression != null); 
    Contract.Ensures(Contract.Result<string>() != null); 
    PropertyInfo propertyInfo = GetPropertyInfo(expression); 
    return propertyInfo.Name; 
} 

public static PropertyInfo GetPropertyInfo<TSource, TProperty>(this Expression<Func<TSource, TProperty>> expression) { 
    Contract.Requires<ArgumentNullException>(expression != null); 
    Contract.Ensures(Contract.Result<PropertyInfo>() != null); 
    var memberExpression = expression.Body as MemberExpression; 
    Guard.Against<ArgumentException>(memberExpression == null, "Expression does not represent a member expression."); 
    var propertyInfo = memberExpression.Member as PropertyInfo; 
    Guard.Against<ArgumentException>(propertyInfo == null, "Expression does not represent a property expression."); 
    Type type = typeof(TSource); 
    Guard.Against<ArgumentException>(type != propertyInfo.ReflectedType && type.IsSubclassOf(propertyInfo.ReflectedType)); 
    return propertyInfo; 
} 

用法:

string s = GetPropertyName((SomeClass x) => x.SomeNumber); 
Console.WriteLine(s); 

和現在的 「SomeNumber」 將被打印到控制檯。

2

號的物業進行評估函數被調用之前,並且在功能的實際值將是值的副本,而不是物業本身。

5

只有當您使用拉姆達時,即,

SomeMethod(()=>someObj.PropName); 

(一個具有該方法採取一個輸入表達式樹,而不是僅僅一個值的)

然而,這仍需要相當多的處理來解決,並涉及反射和表達。除非絕對必要,否則我會避免這樣做只爲了這個,不值得學習表達。

+0

@Adeel不要這麼快就編輯。給這個人一個機會去編輯他自己的東西!我認爲等待五分鐘是恭敬的。 – 2010-11-04 17:17:32

+0

@Josh - 我不介意;我在iPod上,所以我不會注意到,除非他編輯 – 2010-11-04 17:18:23

+0

@Josh是的,我會照顧它。感謝您的建議。 – Adeel 2010-11-04 17:19:07