2010-07-27 24 views
9

我想獲得一個屬性的名稱,例如:淨獲取屬性名

Dim _foo As String 

Public Property Foo as String 
Get 
    Return _foo 
End Get 
Private Set(ByVal value as String) 
    _foo = value 
End Set 

Sub Main() 
    Console.Write(Foo.Name)'Outputs "Foo" 
End Sub 

任何想法如何?

+0

你想要的字符串' 「姓名」'? – leppie 2010-07-27 08:01:43

回答

24

做的。你說的是財產,或者你的意思是一個場

有用於獲取屬性的名稱巧妙拉姆達技術 - 這裏有一個C#示例:

String GetPropertyName<TValue>(Expression<Func<TValue>> propertyId) 
{ 
    return ((MemberExpression)propertyId.Body).Member.Name; 
} 

這樣稱呼它:

GetPropertyName(() => MyProperty) 

它將返回「我的物業」

不知道這是你在做什麼或不。

+0

真是太棒了!謝謝。 – Ucodia 2010-07-27 08:08:25

+0

我寫這個例子的時候,我的想法是在別的地方。現在更改了 – Drahcir 2010-07-27 08:24:06

+1

這個調用示例應該是: MyClass obj = new MyClass(); GetPropertyName((=)obj.MyProperty) – 2010-07-27 09:32:28

0

通過反射。使用類型的GetType()方法,然後查看GetProperties()方法和PropertyInfo類。 (如果您想檢索字符串 「PROPERTYNAME」(對於稱爲propertyName的 - 使用xxx.GetType()GetFields()[0]請將.Name如果它是第一個字段類

+0

只有當您知道該類中屬性的索引時纔有效,因爲該類可以更改或可能不完整,所以該屬性並不真實。 – Ucodia 2010-07-27 08:19:21

3
public static PropertyInfo GetPropInfo<T>(this T @object 
    , Expression<Action<T>> propSelector) 
{ 
    MemberExpression exp= propSelector.Body as MemberExpression; 
    return exp.Member as PropertyInfo; 
} 

然後使用它是這樣的:

string str = .... 
string propertyName = str.GetPropInfo(a => a.Length).Name; 

注意的是,上述方法的延伸,應該如果您正在使用被寫在一個靜態類,並通過包含命名空間

+0

或者在OP的情況下,在VB中它是一個擴展方法,它應該位於Module(非靜態類)中,並使用Extension屬性而不是this關鍵字進行裝飾。 – 2013-07-16 19:35:40

7

使用C#6.0(在問這個問題時沒有發佈)你可以使用nameof(PropertyName)這是在編譯時計算並轉換爲字符串,關於使用nameof()的好處在於你不必在重構時手動更改字符串。 (nameof作品上比屬性更,CallerMemberName更嚴格)

如果你還停留在前期的C#6.0,那麼你可以使用CallerMemberNameAttribute(它需要.NET 4.5)

private static string Get([System.Runtime.CompilerServices.CallerMemberName] string name = "") 
{ 
    if (string.IsNullOrEmpty(name)) 
     throw new ArgumentNullException("name"); 
    return name; 
} 
+0

我不明白爲什麼這不被人理解,但這種方法真的很整齊。謝謝 – CodeWrite 2016-02-23 16:10:04