【问题标题】:Is there a quicker/better way to get Methods that have attribute applied in C#是否有更快/更好的方法来获取在 C# 中应用了属性的方法
【发布时间】:2010-02-07 22:44:04
【问题描述】:

我有一个类似这样的标记界面:

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

我想将它应用于不同程序集中不同类的方法...

然后我想为所有应用了这个属性的方法获取一个 MethodInfo。我需要搜索整个 AppDomain 并获得对所有这些方法的引用。

我知道我们可以获取所有类型,然后获取所有方法,但是有没有更快/更好的方法来做到这一点? ...或者这是获取我需要的信息的最快方式?

(我正在使用 ASP.NET MVC 1.0、C#、./NET 3.5)

谢谢大家!

【问题讨论】:

    标签: c# asp.net-mvc reflection appdomain


    【解决方案1】:

    最终,不 - 你必须扫描它们。不过 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;
    

    请注意,这只会“按原样”扫描加载的程序集。

    【讨论】:

    • 感谢马克!对于 linq 查询......和警告......我敢肯定,这对我和其他人都有帮助。我正在使用 ASP.NET MVC ...我在 ASP.NET 中测试了 re: class loading 因为我发现我的一些单元测试没有加载外部程序集,除非引用了一个类型... ASP.NET 似乎谢天谢地,将所有内容加载到 AppDomain...再次感谢。
    【解决方案2】:

    您应该考虑的一件事是您可以应用于类/结构的附加属性,指示该类型的零个或多个方法已标记。这应该会给您带来至少一个数量级的性能提升。

    如果属性是用户定义的(未内置到 .NET 框架中),那么当您枚举程序集以获取类型时,您应该跳过框架程序集,例如 mscorlib 和 System。

    【讨论】:

      【解决方案3】:

      如果您确实需要性能提升,请按照Marc suggested 执行操作,然后将结果缓存到文件中。下次应用加载时,如果缓存文件存在,就可以加载相应的方法,而不用解析每个程序集。

      这是一个可能的缓存文件示例:

      <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>
      

      【讨论】:

        【解决方案4】:

        几周前我也搜索过这个。我认为没有更简单的方法。
        您可能可以使用 LINQ 对其进行一些改进。

        【讨论】:

        • 我也是这么想的!谢谢
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-17
        • 1970-01-01
        • 2011-05-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多