Метод C # Атрибут требований к силе, таких как абстрактный или статический? - PullRequest
4 голосов
/ 06 марта 2012

Это может быть скорее вопрос дизайна, чем вопрос "Могу ли я это сделать?"вопрос.Я создаю атрибут, цель которого определяется как метод.Есть ли какой-либо возможный способ наложить ограничения на область методов, то есть целевой метод должен быть объявлен как абстрактный, виртуальный, статический и т. Д.?

Конечная цель состоит в том, чтобы сканировать эти методы и реализовывать их вподкласс - однако я бы хотел, чтобы они были абстрактными.Есть ли лучший способ выполнить это псевдо-ограничение для целей моего атрибута?

Ответы [ 2 ]

3 голосов
/ 06 марта 2012

Вы должны иметь возможность отфильтровывать не виртуальные методы, которые украшены вашим атрибутом, используя MethodInfo.IsVirtual и MethodInfo.IsAbstract, чтобы определить, является ли он абстрактным.

foreach(var assem in AppDomain.CurrentDomain.GetAssemblies())
    foreach (var type in assem.GetTypes())
        foreach (var mthdInfo in type.GetMethods())
        {
            if (mthdInfo.GetCustomAttributes(typeof(MyCustomAttribute), false) && mthdInfo.IsVirtual && !mthdInfo.IsFinal)
                // This is a method you can use
        }

Существуют способы обнаружения других перечисленных вами ограничений, и подход должен быть аналогичным.

РЕДАКТИРОВАТЬ: Исправлено, чтобы ответить на вопрос для методов.

2 голосов
/ 06 марта 2012

Нет, извините.Вы можете поиграть с аргументом Inherited в AttributeUsage, хотя это может вам чем-то помочь.

Редактировать: я знаю, что это сообщение не касается вашего вопроса напрямую, но вы можете применить некоторыеиз принципов, которые он обсуждает:

Ограничить пользовательский атрибут, чтобы его можно было применять только к конкретным типам в C #?

...