2008-12-11 10 views
14

J'essaie d'utiliser la réflexion pour obtenir une propriété d'une classe. Voici quelques exemples de code de ce que je vois:Pourquoi GetProperty ne parvient pas à le trouver?


using System.Reflection; 
namespace ConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      PropertyInfo[] tmp2 = typeof(TestClass).GetProperties(); 
      PropertyInfo test = typeof(TestClass).GetProperty(
       "TestProp", BindingFlags.Public | BindingFlags.NonPublic); 
     } 
    } 

    public class TestClass 
    { 
     public Int32 TestProp 
     { 
      get; 
      set; 
     } 
    } 
} 

Quand je trace à travers cela, voici ce que je vois:

  • Quand je vais chercher toutes les propriétés en utilisant GetProperties(), le tableau résultant a un entrée, pour la propriété TestProp.
  • Lorsque j'essaie d'aller chercher TestProp en utilisant GetProperty(), je récupère null.

Je suis un peu perplexe; Je n'ai pas pu trouver quelque chose dans le MSDN concernant GetProperty() pour m'expliquer ce résultat. De l'aide?

EDIT:

Si j'ajoute BindingFlags.Instance à l'appel GetProperties(), pas de propriétés se trouvent, période. Ceci est plus cohérent, et me conduit à croire que TestProp n'est pas considéré comme une propriété d'instance pour une raison quelconque.

Pourquoi cela serait-il? Que dois-je faire à la classe pour que cette propriété soit considérée comme une propriété d'instance?

Répondre

12

Ajouter BindingFlags.Instance à l'appel GetProperty.

EDIT: En réponse au commentaire ...

Le code suivant renvoie la propriété.

Note: Il est une bonne idée de faire réellement votre propriété faire quelque chose avant d'essayer de le récupérer (VS2005) :)

using System.Reflection; 
namespace ConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      PropertyInfo[] tmp2 = typeof(TestClass).GetProperties(); 
      PropertyInfo test = typeof(TestClass).GetProperty(
       "TestProp", 
       BindingFlags.Instance | BindingFlags.Public | 
        BindingFlags.NonPublic); 

      Console.WriteLine(test.Name); 
     } 
    } 

    public class TestClass 
    { 
     public Int32 TestProp 
     { 
      get 
      { 
       return 0; 
      } 
      set 
      { 
      } 
     } 
    } 
} 
+0

Si je fais ça, retourne rien aussi bien GetProperties, ce qui est cohérent , au moins. Mais la question est: que dois-je faire pour trouver la propriété avec GetProperty? Pourquoi TestProp n'est-il pas considéré comme une propriété Instance? –

+0

... ou que dois-je faire pour classer TestClass afin que sa propriété apparaisse comme une propriété d'instance? –

+0

Je n'ai pas pu dupliquer votre problème (bien que j'utilise VS2005, j'ai donc dû étoffer votre propriété avec une implémentation). –

0

Vous devez spécifier si elle est statique ou une instance (ou les deux) aussi.

+0

Voir le commentaire à la publication de Andrew Rolling, ci-dessus. –

1

Essayez d'ajouter la balise suivante:

System.Reflection.BindingFlags.Instance 

EDIT: Cela fonctionne (au moins pour moi)

PropertyInfo test = typeof(TestClass).GetProperty("TestProp", BindingFlags.Public | BindingFlags.Instance); 

Console.WriteLine(test.Name); 
+0

Voir les commentaires au poste d'Andrew Rolling, ci-dessus. –

+0

Vous devez faire quelque chose de mal Remi parce que, avec l'exemple que vous nous avez donné, cela fonctionne très bien ... –

+0

C'est aussi pour moi, maintenant. Je ne peux pas l'expliquer. blâmer l'utilisateur :-) Merci. –