Пользовательские атрибуты, такие как отображаемое имя, не указаны в GetCustomAttribute - PullRequest
4 голосов
/ 30 марта 2011

У меня есть код для определения пользовательских атрибутов, а затем для чтения в коде он не работает. Чтобы попытаться исправить проблему, я вернулся и попытался использовать DisplayName, однако у меня все еще остается та же проблема, что GetCustomAttribute или GetCustomAttributes не может их перечислить. У меня есть пример ниже.

У меня установлен атрибут DisplayName в классе, например ...

class TestClass
 {
        public TestClass() { }

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

Затем у меня есть некоторый код для перечисления атрибута DisplayName для каждого метода в вышеприведенном классе.

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

                    }


            }

Проблема в том, что в списке нет атрибутов DisplayName, код выше компилируется, запускается и не отображает никаких сообщений.

Я даже пытался использовать для каждого цикла с GetCustomAttributes, перечисляя все атрибуты для каждого метода снова. Атрибут DisplayName никогда не перечисляется, однако я получаю атрибуты компиляции и другие подобные системные атрибуты.

Кто-нибудь знает, что я делаю не так?

ОБНОВЛЕНИЕ - Большое спасибо NerdFury за указание, что я использовал методы, а не свойства. После того, как все изменилось, все заработало.

1 Ответ

10 голосов
/ 30 марта 2011

Вы помещаете атрибут в свойство, а не в метод. Попробуйте следующий код:

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