2009-11-03 8 views
7

Possible en double:
c# - How do you get a variable’s name as it was physically typed in its declaration?Comment obtenez-vous un nom de propriété C# en tant que chaîne avec réflexion?

Je suis à la recherche d'un moyen d'obtenir un nom de propriété comme une chaîne pour que je puisse avoir un « fortement typé » chaîne magique. Ce que je dois faire est quelque chose comme MyClass.SomeProperty.GetName() qui retournerait "SomeProperty". Est-ce possible en C#?

Répondre

6

Vous pouvez utiliser des expressions pour y parvenir assez facilement. Voir ceci blog for a sample.

Cela permet de créer une expression via un lambda et de sortir le nom. Par exemple, la mise en œuvre INotifyPropertyChanged peut être retravaillé pour faire quelque chose comme:

public int MyProperty { 
    get { return myProperty; } 
    set 
    { 
     myProperty = value; 
     RaisePropertyChanged(() => MyProperty); 
    } 
} 

Pour mapper votre équivalent, en utilisant la référence de classe « Réfléchir », vous feriez quelque chose comme:

string propertyName = Reflect.GetProperty(() => SomeProperty).Name; 

Viola - les noms de propriétés sans chaînes magiques.

+0

La syntaxe ici est un peu méchant, mais elle fait ce dont j'avais besoin. Merci! –

1

Vous pouvez obtenir une liste des propriétés d'un objet en utilisant la réflexion.

MyClass o; 

PropertyInfo[] properties = o.GetType().GetProperties(
    BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance 
); 

Chaque propriété possède un attribut Nom qui vous obtenir "SomeProperty"

8

Cette approche sera beaucoup plus rapide que d'utiliser maintenant Expression

public static string GetName<T>(this T item) where T : class 
{ 
    if (item == null) 
     return string.Empty; 

    return typeof(T).GetProperties()[0].Name; 
} 

vous pouvez l'appeler:

new { MyClass.SomeProperty }.GetName(); 

Vous pouvez mettre en cache des valeurs si vous avez besoin de performances supplémentaires. Voir cette question en double How do you get a variable's name as it was physically typed in its declaration?

+0

Meilleure réponse ici. Je ne veux pas boucler les propriétés, je veux obtenir un nom de propriété basé sur une propriété réelle. Utiliser le type anonyme avec la première (seulement) propriété étant celle dont vous voulez que le nom soit génial. – Paul

+0

@Paul Je ne suis pas le génie derrière tout ça. Deuxièmement, ce n'est pas très refactor amical. Je veux dire que si vous changez le nom de la propriété, le type anonyme conserve le nom d'origine. Dans ce cas, si vous modifiez 'SomeProperty' à' SomeProperty1', la classe anonyme devient 'new {SomeProperty = SomeProperty1}', ce qui affichera "SomeProperty" au lieu du nom "SomeProperty1" mis à jour. Je vais le mentionner dans la réponse. – nawfal

+0

Darn. Je ne prévois pas changer un nom de propriété, mais si jamais je le faisais, je voudrais que le refactoring le gère. Merci de me le faire savoir. – Paul

Questions connexes