是否有更快/更好的方法来获取在 C# 中应用了属性的方法
Posted
技术标签:
【中文标题】是否有更快/更好的方法来获取在 C# 中应用了属性的方法【英文标题】:Is there a quicker/better way to get Methods that have attribute applied in 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)
谢谢大家!
【问题讨论】:
【参考方案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 对其进行一些改进。
【讨论】:
我也是这么想的!谢谢以上是关于是否有更快/更好的方法来获取在 C# 中应用了属性的方法的主要内容,如果未能解决你的问题,请参考以下文章
在 C# 中是不是有更快的方法来过滤基于 DateTime 的字典?