C# метод Изисквания за сила на атрибута като абстрактни или статични?

Това може да е по-скоро въпрос за дизайн, отколкото "Мога ли да направя това?" въпрос. Създавам атрибут, чиято цел е дефинирана като метод. Има ли някакъв възможен начин за налагане на ограничения върху домейна на методите, т.е. че целевият метод трябва да бъде деклариран абстрактен, виртуален, статичен и т.н.?

Крайната цел е да сканирате за тези методи и да ги внедрите в подклас - но бих искал те да са абстрактни. Има ли по-добър начин да се постигне това псевдоограничение върху целите на моя атрибут?


person OnResolve    schedule 06.03.2012    source източник


Отговори (2)


Трябва да можете да филтрирате невиртуални методи, които са украсени с вашия атрибут, като използвате 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
        }

Има начини да откриете и другите ограничения, които изброихте, и подходът трябва да е подобен.

РЕДАКТИРАНЕ: Коригирано за отговор на въпроса за методите.

person M.Babcock    schedule 06.03.2012
comment
Благодаря за коментара; От страна на внедряването (т.е. когато ги обработвам) ще правя проверката, която изброихте. Въпреки това, и може би формулирах въпроса си зле, бих искал да избегна объркване на моя краен потребител, този, който украсява своя метод с моя атрибут. Да речем, те имат невиртуален, неабстрактен метод, върху който поставят моя атрибут - не мога да изпълня операцията си върху метода, но също така не мога да хвърля изключение, за да прекъсна програмата им. Надявах се, че CLR можеше да улови това, като наложи ограничение, което не позволява на нарушителите да преминат през компилацията. - person OnResolve; 06.03.2012
comment
Няма нищо в средата за изпълнение или компилатора, което да ви позволи да се закачите на нивото, което търсите. Вярвам, че това е нещо, което Рослин ще ви позволи да правите в бъдеще. Като алтернатива бихте могли да напишете тънко конзолно приложение, което вашите потребители да изпълняват в своите действия след компилация, което ще се отрази върху изградения асембли, да направите тези проверки и да изхвърлите всички методи, които не съответстват. - person M.Babcock; 06.03.2012

Не, съжелявам. Можете обаче да си поиграете с аргумента Inherited в AttributeUsage, може да ви помогне донякъде.

Редактиране: Знам, че тази публикация не адресира директно въпроса ви, но може да успеете да приложите някои от принципите, които обсъжда:

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

person eouw0o83hf    schedule 06.03.2012