web-dev-qa-db-fra.com

Comment obtenir le PropertyInfo d'une propriété spécifique?

Je veux obtenir le PropertyInfo pour une propriété spécifique. Je pourrais utiliser:

foreach(PropertyInfo p in typeof(MyObject).GetProperties())
{
    if ( p.Name == "MyProperty") { return p }
}

Mais il doit y avoir un moyen de faire quelque chose de similaire à

typeof(MyProperty) as PropertyInfo

Y a-t-il? Ou suis-je coincé à faire une comparaison de chaînes non sécurisée?

À votre santé.

77
tenpn

Vous pouvez utiliser le nouvel opérateur nameof() qui fait partie de C # 6 et disponible dans Visual Studio 2015. Plus d'informations ici .

Pour votre exemple, vous utiliseriez:

PropertyInfo result = typeof(MyObject).GetProperty(nameof(MyObject.MyProperty));

Le compilateur convertira nameof(MyObject.MyProperty) en la chaîne "MyProperty" mais vous obtenez l'avantage de pouvoir refactoriser le nom de la propriété sans avoir à vous rappeler de changer la chaîne car Visual Studio, ReSharper et autres savent comment refactor nameof() values.

53
Kevin Kalitowski

Il existe un moyen .NET 3.5 avec lambdas/Expression qui n'utilise pas de chaînes ...

using System;
using System.Linq.Expressions;
using System.Reflection;

class Foo
{
    public string Bar { get; set; }
}
static class Program
{
    static void Main()
    {
        PropertyInfo prop = PropertyHelper<Foo>.GetProperty(x => x.Bar);
    }
}
public static class PropertyHelper<T>
{
    public static PropertyInfo GetProperty<TValue>(
        Expression<Func<T, TValue>> selector)
    {
        Expression body = selector;
        if (body is LambdaExpression)
        {
            body = ((LambdaExpression)body).Body;
        }
        switch (body.NodeType)
        {
            case ExpressionType.MemberAccess:
                return (PropertyInfo)((MemberExpression)body).Member;
            default:
                throw new InvalidOperationException();
        }
    }
}
130
Marc Gravell

Tu peux le faire:

typeof(MyObject).GetProperty("MyProperty")

Cependant, puisque C # n'a pas de type "symbole", il n'y a rien qui vous aidera à éviter d'utiliser une chaîne. Pourquoi appelez-vous ce type dangereux, au fait?

12
Vojislav Stojkovic

La réflexion est utilisée pour l'évaluation du type d'exécution. Vos constantes de chaîne ne peuvent donc pas être vérifiées au moment de la compilation.

1
Darin Dimitrov