Как бы я использовал рефлексию для вызова всех методов, которые имеют определенный пользовательский атрибут?

У меня есть класс с кучей методов.

некоторые из этих методов помечены пользовательским атрибутом.

Я хотел бы вызвать все эти методы сразу.

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

2 ответа

Решение

Как только вы получите список методов, вы будете циклически запрашивать пользовательские атрибуты, используя метод GetCustomAttributes. Возможно, вам придется изменить BindingFlags в соответствии с вашей ситуацией.

var methods = typeof( MyClass ).GetMethods( BindingFlags.Public );

foreach(var method in methods)
{
    var attributes = method.GetCustomAttributes( typeof( MyAttribute ), true );
    if (attributes != null && attributes.Length > 0)
        //method has attribute.

}

Сначала вы должны вызвать typeof(MyClass).GetMethods(), чтобы получить массив всех методов, определенных для этого типа, затем выполнить цикл по каждому из возвращаемых методов и вызвать methodInfo.GetCustomAttributes (typeof (MyCustomAttribute), true) для получить массив пользовательских атрибутов указанного типа. Если массив нулевой длины, то ваш атрибут отсутствует в методе. Если он ненулевой, то ваш атрибут находится в этом методе, и вы можете использовать MethodInfo.Invoke() для его вызова.

Другие вопросы по тегам