98 votes

Vérifier si une propriété existe dans une classe

J'essaie de savoir si une propriété existe dans une classe, j'ai essayé ceci :

public static bool HasProperty(this object obj, string propertyName)
{
    return obj.GetType().GetProperty(propertyName) != null;
}

Je ne comprends pas pourquoi la première méthode de test ne passe pas ?

[TestMethod]
public void Test_HasProperty_True()
{
    var res = typeof(MyClass).HasProperty("Label");
    Assert.IsTrue(res);
}

[TestMethod]
public void Test_HasProperty_False()
{
    var res = typeof(MyClass).HasProperty("Lab");
    Assert.IsFalse(res);
}

151voto

Jamiec Points 35773

Votre méthode ressemble à ceci :

public static bool HasProperty(this object obj, string propertyName)
{
    return obj.GetType().GetProperty(propertyName) != null;
}

Cela ajoute une extension sur object - la classe de base de tout . Quand vous appelez cette extension, vous lui transmettez un Type :

var res = typeof(MyClass).HasProperty("Label");

Votre méthode attend un instance d'une classe, et non d'une Type . Sinon, vous faites essentiellement

typeof(MyClass) - this gives an instanceof `System.Type`. 

Entonces

type.GetType() - this gives `System.Type`
Getproperty('xxx') - whatever you provide as xxx is unlikely to be on `System.Type`

Comme @PeterRitchie l'a correctement souligné, à ce stade, votre code recherche la propriété Label sur System.Type . Cette propriété n'existe pas.

La solution est soit

a) Fournir un instance de MyClass à l'extension :

var myInstance = new MyClass()
myInstance.HasProperty("Label")

b) Mettre l'extension System.Type

public static bool HasProperty(this Type obj, string propertyName)
{
    return obj.GetProperty(propertyName) != null;
}

y

typeof(MyClass).HasProperty("Label");

28voto

statue Points 362

Cela répond à une autre question :

Si vous essayez de déterminer si un OBJET (et non une classe) possède une propriété,

OBJECT.GetType().GetProperty("PROPERTY") != null

renvoie la réponse vraie si (mais pas seulement si) la propriété existe.

Dans mon cas, j'étais dans une vue partielle ASP.NET MVC et je voulais rendre quelque chose si soit la propriété n'existait pas, soit la propriété (booléenne) était vraie.

@if ((Model.GetType().GetProperty("AddTimeoffBlackouts") == null) ||
        Model.AddTimeoffBlackouts)

m'a aidé ici.

Edit : De nos jours, il est probablement plus judicieux d'utiliser la fonction nameof à la place du nom de la propriété.

3voto

JedatKinports Points 2155

J'ai obtenu cette erreur : "Le type ne contient pas de définition pour GetProperty" lorsque j'ai attaché la réponse acceptée.

C'est ce à quoi j'ai abouti :

using System.Reflection;

if (productModel.GetType().GetTypeInfo().GetDeclaredProperty(propertyName) != null)
{

}

2voto

Zdeslav Vojkovic Points 8911

Il y a deux possibilités.

Vous n'avez vraiment pas Label propriété.

Vous devez appeler les personnes appropriées Surcharge GetProperty et passer les drapeaux de liaison corrects, par ex. BindingFlags.Public | BindingFlags.Instance

Si votre propriété n'est pas publique, vous devrez utiliser BindingFlags.NonPublic ou une autre combinaison de drapeaux qui correspond à votre cas d'utilisation. Lisez les docs de l'API référencée pour trouver les détails.

EDIT :

ooops, je viens de remarquer que vous appelez GetProperty sur typeof(MyClass) . typeof(MyClass) est Type qui n'a certainement pas Label propriété.

0voto

BenAdler Points 96

Si vous êtes contraignant comme je l'étais :

<%# Container.DataItem.GetType().GetProperty("Property1") != null ? DataBinder.Eval(Container.DataItem, "Property1") : DataBinder.Eval(Container.DataItem, "Property2")  %>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X