web-dev-qa-db-fra.com

Obtenir le nom de chaîne de la propriété à l'aide de la réflexion

Il existe une multitude d'exemples de réflexion qui vous permettent d'obtenir soit:

    1. Toutes les propriétés d'une classe

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

Existe-t-il un moyen (en utilisant la réflexion, TypeDescriptor ou autre) pour obtenir le nom de chaîne d'une propriété dans une classe au moment de l'exécution, à condition que je ne dispose que d'une instance de la classe et de la propriété?

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, c'est une fonction pour me donner le nom d'une propriété, à condition que je lui passe l'instance de la propriété. En d'autres termes, comment puis-je trouver la propriété que je veux du tableau PropertyInfo [] qui m'a été renvoyée par class.GetType (). GetProperty (myProperty) afin que je puisse en obtenir le PropertyInfo.Name?

45
Joel B

Si vous avez déjà un PropertyInfo, alors la réponse de @ dtb est la bonne. Si, cependant, vous souhaitez découvrir le code de la propriété dans laquelle vous vous trouvez actuellement, vous devrez parcourir la pile d'appels actuelle pour trouver la méthode que vous exécutez actuellement et en dériver le nom de la propriété.

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);

Modifier:

Après votre clarification, je me demande si ce que vous voulez faire est d'obtenir le nom d'une propriété à partir d'une expression de propriété . Si c'est le cas, vous voudrez peut-être écrire une méthode comme celle-ci:

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

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

var propertyName = GetPropertyName(
    () => myObject.AProperty); // returns "AProperty"
89
Jacob

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);
47
saluce
13
dtb

Au cas où quelqu'un en aurait besoin ... voici la version VB .NET 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

Usage:

Dim name As String = GetPropertyName(Function() (New myObject).AProperty)
5
TKTS

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

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

et l'utilisation de ce code ressemble à l'exemple ci-dessous:

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

en outre: il peut y avoir une exception lorsque lorsque le est livré avec toutes les propriétés a des valeurs nulles, tout le monde doit prendre cela sur sa concentration lors de la mise en œuvre de son code

Merci TKTS ..

3
Ahmad Hindash

myClassInstance.GetType().GetProperties() vous donne des instances de PropertyInfo 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 MSDN à nouveau) .

0
Ondrej Tucny

J'ai utilisé la version fournie par Jacob mais parfois elle donnait une exception. C'était parce que le casting n'était pas valide. 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;
    }
0
Michael Bahig