2010-07-27 17 views
9

Vorrei ottenere il nome di una proprietà, ad esempio:.Net Get nome della proprietà

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 

Tutte le idee come?

+0

si desidera che la stringa ' "Nome" '? – leppie

risposta

24

Do. si intende una proprietà, o vuoi dire un campo

ci sono intelligenti tecniche lambda per ottenere i nomi delle proprietà - qui è un C# esempio:?

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

chiamare in questo modo:

GetPropertyName(() => MyProperty) 

e restituirà "MyProperty"

Non so se è quello che stai cercando o no.

+0

Davvero geniale! Grazie. – Ucodia

+0

Il mio errore era la mia mente da qualche altra parte quando ho scritto l'esempio. Modificato ora – Drahcir

+1

l'esempio di chiamata dovrebbe essere: MyClass obj = new MyClass(); GetPropertyName (() => obj.MyProperty) –

0

tramite riflessione. Utilizzare il metodo GetType() del tipo, quindi esaminare il metodo GetProperties() e la classe PropertyInfo. (Se si desidera recuperare la stringa "propertyName" (per un campo chiamato propertyName -. Utilizzare xxx.GetType() GetFields() [0] .Name se è primo campo nella classe

+0

Funziona solo se si conosce l'indice della proprietà nella classe, che non è realmente realizzabile in quanto la classe può cambiare o può essere parziale. – Ucodia

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

Quindi utilizzare in questo modo:

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

Si noti che il metodo di cui sopra è un'estensione e dovrebbe essere scritto in una classe statica e usate da incluso il namespace

+0

O nel caso dell'OP, in VB è un metodo di estensione che dovrebbe essere in un modulo (non in una classe statica) e decorato con l'attributo Extension piuttosto che con questa parola chiave. –

7

Se si utilizza C# 6.0 (non rilasciato quando è stata richiesta questa domanda) è possibile utilizzare nameof(PropertyName) questo viene valutato in fase di compilazione e viene convertito in una stringa, la cosa bella dell'utilizzo di nameof() è che non è necessario modificare manualmente una stringa quando si refactoring. (nameof opere in più di proprietà, CallerMemberName è più restrittiva)

Se siete ancora bloccato in pre C# 6.0 quindi è possibile utilizzare CallerMemberNameAttribute (richiede .NET 4,5)

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

Non so perché questo non è stato molto apprezzato, ma questo metodo è davvero accurato. Grazie – CodeWrite

Problemi correlati