2010-10-13 80 views
1

孔加入nameof到C#,我並不孤單誰是生病被不斷地只是用來做數據綁定神奇的字符串 - 參見:通過後門

How to make Databinding type safe and support refactoring

但是我關心的性能這個解決方案和更多的輸入 - 每次你想使用nameof你必須輸入一個lambda。所以我想到了更強大的方法 - 編寫一個函數nameof和外部程序,它會在編譯之前更改每個.cs文件。

public string nameof<T>(T obj,string name = null) 
{ 
    return name; 
} 

你會使用這種方式

nameof(the_object.MyProperty); 

關鍵在於外部程序幫助nameof - 它會搜索nameof的任何號召,只需更換

nameof(X.Y.Z) 

nameof(X.Y.Z,"s") 

in到

nameof(X.Y.Z,"Z") 

我的問題是 - 什麼限制,這種方法的缺陷你看?或者,也許.Net 5.0內置nameof將在下週發佈,所以開始爲它編寫程序是沒有意義的? ;-)

預先感謝您的想法,建議等。

+1

如果你想在5.0這個功能,不要屏住呼吸,它可能不會發生...看到[這篇文章](http://blogs.msdn.com/b/ericlippert/archive/2009/05/21/in-foof-we-trust-a-dialogue.aspx)的原因。 (但我同意它會非常方便,至少對於屬性,如果不是方法) – 2010-10-13 08:10:12

回答

3

做任何預編譯代碼更改將是一個極端的麻煩。所以我會避免它。

我不會太擔心性能 - 大多數情況下,當你需要一個屬性名稱作爲字符串時,你最終會做反射或IO,所以無論如何性能會相對較慢。

這裏就是我建議使用:

public static string ToPropertyName<T>(this Expression<Func<T>> @this) 
{ 
    var @return = string.Empty; 
    if (@this != null) 
    { 
     var memberExpression = @this.Body as MemberExpression; 
     if (memberExpression != null) 
     { 
      @return = memberExpression.Member.Name; 
     } 
    } 
    return @return; 
} 

現在你可以這樣做:

Expression<Func<T>> px = x => x.Foo; 
var pn = px.ToPropertyName(); // == "Foo" 
+1

這是@return表示法?我從來沒有見過這個。 – Alex 2010-10-13 07:15:01

+2

@Alex:這是混淆其他程序員。它允許您使用關鍵字作爲變量名稱。 – Henrik 2010-10-13 07:35:41

+0

感謝您指出性能問題。現在我正考慮爲每個需要名稱的屬性放置一個名稱爲靜態只讀屬性的名稱,這樣,名稱就會被評估一次。 – greenoldman 2010-10-13 07:42:52