Есть более быстрый / лучший способ получить методы, которые имеют атрибут, применяемый в C # - PullRequest
5 голосов
/ 08 февраля 2010

У меня интерфейс маркера примерно такой:

[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited=true)]
public class MyAttribute : Attribute
{
}

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

Затем я хочу получить MethodInfo для всех методов, к которым применен этот атрибут. Мне нужно найти весь AppDomain и получить ссылку на все эти методы.

Я знаю, что мы можем получить все типы и затем получить все методы, но есть ли более быстрый / лучший способ сделать это? ... или это самый быстрый способ получить нужную мне информацию?

(я использую ASP.NET MVC 1.0, C #, ./NET 3.5)

Спасибо, куча!

Ответы [ 4 ]

14 голосов
/ 08 февраля 2010

В конечном счете, нет - вы должны их сканировать. LINQ делает его довольно безболезненным.

        var qry = from asm in AppDomain.CurrentDomain.GetAssemblies()
                  from type in asm.GetTypes()
                  from method in type.GetMethods()
                  where Attribute.IsDefined(method, typeof(MyAttribute))
                  select method;

Обратите внимание, что сканируются только загруженные сборки "как есть".

2 голосов
/ 09 февраля 2010

Если вам действительно нужно повышение производительности, сделайте, как Марк предложил , а затем кешируйте результаты в файл. При следующей загрузке приложения, если кэшированный файл существует, он может загрузить соответствующий метод, не анализируя каждую сборку.

Вот пример возможного файла кэша:

<attributeCache>

  <assembly name='Assembly1' filename='Assembly1.dll' timestamp='02/02/2010'>
    <type name='Assembly1.Type1'>
      <method name='Method1'/>
    </type>
  </assembly>

 <assembly name='Assembly2' filename='Assembly2.dll' timestamp='02/02/2010' />
</attributeCache>
2 голосов
/ 08 февраля 2010

Одна вещь, которую вы должны рассмотреть, - это дополнительный атрибут, который вы можете применить к классу / структуре, указывающий, что помечено ноль или более методов этого типа. Это должно дать вам как минимум на порядок улучшение производительности.

Если атрибут определяется пользователем (не встроен в .NET Framework), то при перечислении сборок для получения типов следует пропустить сборки Framework, такие как mscorlib и System.

0 голосов
/ 08 февраля 2010

Я искал это также несколько недель назад.Я думаю, что нет более легкого пути.
Возможно, вам удастся немного уловить это с помощью LINQ.

...