:: Не фоксом единым
Пользовательский атрибут
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Почитал про атрибуты и про то, как их можно с помощью рефлексии увидеть msdn.microsoft.com Попробовал - работает:

[System.AttributeUsage(System.AttributeTargets.Method| System.AttributeTargets.Class)]
public class MyInfoAttribute : Attribute
{
public string Name { get; set; }
public MyInfoAttribute() { }
public MyInfoAttribute(string name)
{
Name = name;
}
}
[MyInfo(Name = "Пользовательский атрибут")]
class myClass
{
public void myFunc() { }
}
class Program
{
static void Main()
{
Type t = typeof(myClass);
object[] attrs = t.GetCustomAttributes(false);
foreach (MyInfoAttribute roleAttr in attrs)
{
Console.WriteLine(roleAttr.Name); // "Пользовательский атрибут"
}
Console.ReadLine();
}
}

Но, если делаю:

class myClass
{
[MyInfo(Name = "Пользовательский атрибут")]
public void myFunc() { }
}

то ни чего не выводится. Иначе говоря, не получается вывести на экран пользовательский атрибут метода, хотя пользовательский атрибут класса выводится без проблем. В чём может быть проблема? Куда копать?



Исправлено 2 раз(а). Последнее : S-type, 27.03.17 19:29
Ratings: 0 negative/0 positive
Re: Пользовательский атрибут
GotFocus

Сообщений: 1191
Откуда: Из-за угла
Дата регистрации: 30.11.2010
Может [Display(Name = "Имя")] поможет ?
Ratings: 0 negative/0 positive
Re: Пользовательский атрибут
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
GotFocus
Может [Display(Name = "Имя")] поможет ?

Простите, не понял. Пожалуйста, опишите поподробней.
Ratings: 0 negative/0 positive
Re: Пользовательский атрибут
GotFocus

Сообщений: 1191
Откуда: Из-за угла
Дата регистрации: 30.11.2010
Поставить [Display(Name = "Имя")] выше свойства
Ratings: 0 negative/0 positive
Re: Пользовательский атрибут
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
GotFocus
Поставить [Display(Name = "Имя")] выше свойства

Имеется ввиду свойство Name?

[Display(Name = "Имя")]
public string Name { get; set; }

Ругается:

Цитата:
Ошибка CS0246 Не удалось найти тип или имя пространства имен "DisplayAttribute" (возможно, отсутствует директива using или ссылка на сборку).
Ratings: 0 negative/0 positive
Re: Пользовательский атрибут
SoccerStudio

Сообщений: 5055
Откуда: Подмосковье
Дата регистрации: 28.11.2006
object[] attrs = t.GetCustomAttributes() - это ты получаешь пользовательские атрибуты от t. т.е. от класса. С чего же ты считаешь, что атрибуты метода тоже должны быть там? Если правильно помню, нужно сначала получить MethodInfo метода, а у него уже смотреть CustomAttributes, тогда будет норм.


------------------
"Здесь я, братцы, сдержу матерщину, и скажу только "... мать!"" (с) Шаов
Ratings: 0 negative/0 positive
Re: Пользовательский атрибут
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
S-type
Но, если делаю:
class myClass
{
[MyInfo(Name = "Пользовательский атрибут")]
void myFunc() { }
}

то ни чего не выводится. Иначе говоря, не получается вывести на экран пользовательский атрибут метода, хотя пользовательский атрибут класса выводится без проблем. В чём может быть проблема? Куда копать?

Ну а с чего бы этому коды выводить атрибуты метода, если он выводит атрибуты самого типа? Или ты полагаешь что атрибуты методов привязываются заодно и к самому типу

Нужно для метода - так и запрашивай атрибуты метода.
Т.к. ты сам себе усложнил жизнь определив этот метод как private, то придётся использовать перегрузку с указанием флагов. Иначе можно было бы только по имени искать.

object[] attrs = t.GetMethod("myFunc", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetCustomAttributes(false);

А для надёжности (чтобы не вываливалось по NullReferenceException) написать всё это к примеру так:
object[] attrs = t.GetMethod("myFunc", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)?.GetCustomAttributes(false);
if (attrs != null)
...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Пользовательский атрибут
GotFocus

Сообщений: 1191
Откуда: Из-за угла
Дата регистрации: 30.11.2010
S-type
GotFocus
Поставить [Display(Name = "Имя")] выше свойства

Имеется ввиду свойство Name?

[Display(Name = "Имя")]
public string Name { get; set; }

Ругается:

Цитата:
Ошибка CS0246 Не удалось найти тип или имя пространства имен "DisplayAttribute" (возможно, отсутствует директива using или ссылка на сборку).

Поставить
using System.ComponentModel.DataAnnotations;

и ругаться не будет

class myClass
{
[MyInfo(Name = "Пользовательский атрибут")]
[Display(Name = "Имя")]
void myFunc() { }
}



Исправлено 1 раз(а). Последнее : GotFocus, 27.03.17 17:54
Ratings: 0 negative/0 positive
Re: Пользовательский атрибут
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
SoccerStudio
... это ты получаешь пользовательские атрибуты от t. т.е. от класса. С чего же ты считаешь, что атрибуты метода тоже должны быть там?

Хороший вопрос! Видимо, потому что у меня неправильное представление о том, как всё устроено.
Ratings: 0 negative/0 positive
Re: Пользовательский атрибут
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
Ну а с чего бы этому коды выводить атрибуты метода, если он выводит атрибуты самого типа? Или ты полагаешь что атрибуты методов привязываются заодно и к самому типу
Полагаю, что ещё плохо знаю мат.часть... Хотя, с другой стороны, если бы не начал читать документацию, по атрибутам, так бы и не узнал - как оно, на самом деле.

Igor Korolyov
Нужно для метода - так и запрашивай атрибуты метода.
Т.к. ты сам себе усложнил жизнь определив этот метод как private, то придётся использовать перегрузку с указанием флагов. Иначе можно было бы только по имени искать.

В общем то, можно и public. Пример - просто абстрактный, сделан для изучения C#.
Ratings: 0 negative/0 positive
Re: Пользовательский атрибут
SoccerStudio

Сообщений: 5055
Откуда: Подмосковье
Дата регистрации: 28.11.2006
S-type
SoccerStudio
... это ты получаешь пользовательские атрибуты от t. т.е. от класса. С чего же ты считаешь, что атрибуты метода тоже должны быть там?

Хороший вопрос! Видимо, потому что у меня неправильное представление о том, как всё устроено.

Собственно, Игорь тебе уже написал подробно, то что я сказал кратко. А вообще, помнится, в свое время мне попалась толстенная книга, что-то типа "C# 2005 и платформа .NET 3.0" (за точность названия не ручаюсь, но что-то типа этого, книга бледно-красная и очень толстая, фотография кучи авторов на обложке). Так вот там многие вопросы очень хорошо были разжеваны, в частности, все, что касается рефлексии. Думаю, и в более поздних изданиях хуже тоже быть не должно.


------------------
"Здесь я, братцы, сдержу матерщину, и скажу только "... мать!"" (с) Шаов




Исправлено 1 раз(а). Последнее : SoccerStudio, 27.03.17 19:23
Ratings: 0 negative/0 positive
Re: Пользовательский атрибут
S-type
Автор

Сообщений: 2969
Дата регистрации: 24.04.2004
Спасибо. Всё действительно хорошо работает.

class myClass
{
[MyInfo(Name = "Пользовательский атрибут")]
public void myFunc() { }
}
class Program
{
static void Main(string[] args)
{
Type t = typeof(myClass);
object[] attrs = t.GetMethod("myFunc")?.GetCustomAttributes(false);
if (attrs != null)
{
foreach (MyInfoAttribute roleAttr in attrs)
{
Console.WriteLine(roleAttr.Name); // "Пользовательский атрибут"
}
}
Console.ReadLine();
}
}

Правда, попутно обнаружил, что с C# 7 можно указать


if (!(attrs is null))

но нельзя

if (attrs is !null)
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 7 (Гостей: 7)

© 2000-2024 Fox Club 
Яндекс.Метрика