2010-09-07 6 views
38

Il y a une foule entière d'exemples de réflexion là-bas qui vous permettent d'obtenir soit:Obtenir le nom de chaîne de propriété en utilisant la réflexion

    1. Toutes les propriétés dans une classe

    2. Une seule propriété, à condition vous connaissez le nom de la chaîne

est-il un moyen (utilisant la réflexion, TypeDescriptor ou autre) pour obtenir le nom de la chaîne d'une propriété dans une classe à l'exécution, à condition tout ce que j'ai est une instance de la classe et des biens ?

EDIT Je sais que je peux facilement obtenir toutes les propriétés d'une classe en utilisant la réflexion, puis obtenir le nom de chaque propriété. Ce que je demande est une fonction pour me donner le nom d'une propriété, à condition que je lui transmette l'instance de la propriété. En d'autres termes, comment puis-je trouver la propriété que je veux à partir du tableau PropertyInfo [] retourné à partir de la class.GetType(). GetProperty (myProperty) afin que je puisse obtenir le PropertyInfo.Name de celui-ci?

+3

Voulez-vous dire obtenir le nom d'une propriété dans le getter/setter de la propriété? Que voulez-vous dire par «avoir» une propriété? – Jacob

+1

@Jacob - Pour ajouter une certaine clarté, j'ai une instance de la classe avec la propriété (ainsi que d'autres propriétés) que je veux obtenir le nom de la chaîne (pas le getter/setter). J'ai besoin de travailler sur cette propriété en utilisant Reflection, mais je ne veux pas conserver de code avec des noms de chaînes codés en dur au cas où je refactoriserais le nom de la propriété. Ainsi, je veux programmer le nom de la propriété. –

+1

Comment pouvez-vous identifier la propriété que vous voulez, si ce n'est par son nom? – jnylen

Répondre

81

Si vous avez déjà un PropertyInfo, alors la réponse de @ dtb est la bonne. Cependant, si vous souhaitez connaître le code de la propriété dans laquelle vous vous trouvez, vous devrez parcourir la pile d'appels actuelle pour trouver la méthode que vous êtes en train d'exécuter et en dériver le nom.

var stackTrace = new StackTrace(); 
var frames = stackTrace.GetFrames(); 
var thisFrame = frames[0]; 
var method = thisFrame.GetMethod(); 
var methodName = method.Name; // Should be get_* or set_* 
var propertyName = method.Name.Substring(4); 

Edit:

Après cet éclaircissement, je me demande si ce que vous êtes désireux de faire est d'obtenir le nom d'une propriété d'une propriété expression. Si oui, vous voudrez peut-être écrire une méthode comme ceci:

public static string GetPropertyName<T>(Expression<Func<T>> propertyExpression) 
{ 
    return (propertyExpression.Body as MemberExpression).Member.Name; 
} 

Pour l'utiliser, vous devez écrire quelque chose comme ceci:

var propertyName = GetPropertyName(
    () => myObject.AProperty); // returns "AProperty" 
+0

+1 pour l'utilisation de Expression; Je n'ai pas compris la question de cette façon. –

+0

+1 pour l'expression. Je devenais juste Dead Crazy avec ça! Mille mercis, mec ... (BTW, si vous pouviez m'expliquer un peu la syntaxe C#, parce que ça sonne assez avancé, je dois avouer que je n'ai pas vraiment tout compris, même si ça fonctionne comme un charme) –

+1

La syntaxe est un peu bizarre. La syntaxe des expressions est similaire à la syntaxe des expressions lambda; que ce soit l'un ou l'autre dépend du type du paramètre dans la méthode appelée. Si '() => myObject.AProperty' était une expression lambda où AProperty était de type' int', son type se traduit fondamentalement par "une méthode sans paramètre'() 'qui retourne' => 'an' int' (implicitement déterminé par le typage statique), ce qui équivaut à 'Func '. Puisque 'GetPropertyName' prend une' Expression', le type du paramètre se traduit par 'Expression >' – Jacob

0

myClassInstance.GetType().GetProperties() vous donne PropertyInfo cas pour toutes les propriétés publiques pour le type de myClassInstance. (Voir MSDN pour la documentation et autres surcharges.)'PropertyInfo.Name 'est le nom réel de la propriété. Dans le cas où vous connaissez déjà le nom de la propriété, utilisez GetProperty(name) pour récupérer son objet PropertyInfo (voir à nouveau MSDN).

5

Au cas où quelqu'un en a besoin ... est ici le VB .NET Version de la réponse:

Public Shared Function GetPropertyName(Of t)(ByVal PropertyExp As Expression(Of Func(Of t))) As String 
    Return TryCast(PropertyExp.Body, MemberExpression).Member.Name 
End Function 

Utilisation:

Dim name As String = GetPropertyName(Function() (New myObject).AProperty) 
+0

Merci TKTS, votre réponse est grande, ce qui est le code C# de cette syntaxe chaîne statique publique getPropertyName (expression > PropertyExp) { \t return (Pro pertyExp.Body en tant que MemberExpression) .Member.Name; } chaîne nom = GetPropertyName (() => (nouvelles tâches()). Titre); –

0

J'ai utilisé la version fournie par Jacob mais parfois elle a donné une exception. C'était parce que la distribution était invalide.Cette version a résolu le problème:

public static string GetPropertyName<T>(this Expression<Func<T>> propertyExpression) 
    { 
     ConstantExpression cExpr = propertyExpression.Body as ConstantExpression; 
     MemberExpression mExpr = propertyExpression.Body as MemberExpression; 

     if (cExpr != null) 
      return cExpr.Value.ToString(); 
     else if (mExpr != null) 
      return mExpr.Member.Name; 

     else return null; 
    } 
3

acutully la bonne réponse qui est écrit par TKTS, et ici, je veux juste convertir sa syntaxe C#

public static string GetPropertyName<t>(Expression<Func<t>> PropertyExp) 
{ 
return (PropertyExp.Body as MemberExpression).Member.Name; 
} 

et l'utilisation de ce code va comme la par exemple comme ci-dessous:

string name = GetPropertyName(() => (new Tasks()).Title); 

en plus: il y a une exception pourrait être arriver que lorsque le est livré avec toutes les propriétés a des valeurs nulles, donc tout le monde doit prendre cela sur sa concentration quand hes la mise en œuvre son code

TKTS Merci ..

37

avec C# 6.0 (Visual Studio 2015), vous pouvez maintenant utiliser l'opérateur nameof, comme ceci:

var obj = new MyObject(); 
string propertyName = nameof(obj.Property); 
string methodName = nameof(obj.Method); 
string directPropertyName = nameof(MyObject.Property); 
string directMethodName = nameof(MyObject.Method); 
+1

C'est une très bonne méthode. – Gandalf458

Questions connexes