Question

J'ai du code pour définir les attributs personnalisés, puis pour lire dans le code, cela ne fonctionne pas. Pour essayer de résoudre le problème que je suis retourné et j'ai essayé d'utiliser DisplayName, cependant, j'ai toujours le même problème que GetCustomAttribute ou GetCustomAttributes ne les répertorie pas. J'ai un exemple ci-dessous.

J'ai un attribut DisplayName dans une classe, par exemple ...

class TestClass
 {
        public TestClass() { }

        [DisplayName("this is a test")]
        public long testmethod{ get; set; }
 }

J'ai ensuite du code pour répertorier l'attribut DisplayName pour chaque méthode de la classe ci-dessus.

TestClass testClass = new TestClass();

   Type type = testClass.GetType();

            foreach (MethodInfo mInfo in type.GetMethods())
            {

            DisplayNameAttribute attr = (DisplayNameAttribute)Attribute.GetCustomAttribute(mInfo, typeof(DisplayNameAttribute));

                   if (attr !=null)
                    {
                        MessageBox.Show(attr.DisplayName);   

                    }


            }

Le problème est qu'il n'y a pas d'attributs DisplayName répertoriés, le code ci-dessus compile, s'exécute et n'affiche aucune boîte de message.

J'ai même essayé d'utiliser un pour chaque boucle avec getCustomAttributes, répertoriant tous les attributs pour chaque méthode à nouveau que l'attribut DisplayName n'est jamais répertorié, cependant, j'obtiens les attributs de compilation et d'autres attributs de système de ce type.

Quelqu'un a une idée de ce que je fais de mal?

MISE À JOUR - Un grand merci à Nerdfury pour avoir souligné que j'utilisais des méthodes et non des propriétés. Une fois changé, tout a fonctionné.

Était-ce utile?

La solution

Vous mettez l'attribut sur une propriété et non une méthode. Essayez le code suivant:

TestClass testClass = new TestClass();

   Type type = testClass.GetType();

   foreach (PropertyInfo pInfo in type.GetProperties())
   {
       DisplayNameAttribute attr = (DisplayNameAttribute)Attribute.GetCustomAttribute(pInfo, typeof(DisplayNameAttribute));

       if (attr !=null)
       {
           MessageBox.Show(attr.DisplayName);   
       }
   }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top