Как бы я использовал отражение, чтобы вызвать все методы, которые имеют определенный пользовательский атрибут? - PullRequest
6 голосов
/ 14 мая 2010

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

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

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

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

Ответы [ 2 ]

7 голосов
/ 14 мая 2010

Как только вы получите список методов, вы будете циклически запрашивать пользовательские атрибуты, используя метод 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.

}
6 голосов
/ 14 мая 2010

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

...