.net 如何在程序集中*高效*定位特定类型?
我正在寻找一种更有效的方法来在程序集中查找从已知特定类型派生的类型。基本上,我的应用程序中有一个插件体系结构,我们一直在这么做:.net 如何在程序集中*高效*定位特定类型?,.net,reflection,assemblies,types,.net,Reflection,Assemblies,Types,我正在寻找一种更有效的方法来在程序集中查找从已知特定类型派生的类型。基本上,我的应用程序中有一个插件体系结构,我们一直在这么做: For Each t As Type In assem.GetTypes() If t.BaseType Is pluginType Then 'Do Stuff here' End If Next 一些插件有大量的类型,我们开始看到这需要几秒钟的时间。我有没有办法只要求所有的类型都有一个“pluginType”的基类型 编辑: 我过
For Each t As Type In assem.GetTypes()
If t.BaseType Is pluginType Then
'Do Stuff here'
End If
Next
一些插件有大量的类型,我们开始看到这需要几秒钟的时间。我有没有办法只要求所有的类型都有一个“pluginType”的基类型
编辑:
我过度简化了我的代码示例。我在实际代码中使用了.GetExportedTypes()。然而,我发现很多课程都被标记为公共的,所以这并没有太大帮助。我梳理了所有的项目,除了实际的插件类之外,我把所有的东西都标记为“Friend”,并且检查程序集仍然需要差不多相同的时间。我把1.3秒的时间缩短了100毫秒(小于10%)。这只是我必须处理的最短时间吗?我还尝试了Assembly属性建议,但仍然没有产生太大的差异(可能又是100ms)。其余时间是动态加载程序集所需的开销吗?Assembly.GetExportedTypes()只返回公共类。这是否有帮助?首先,您可以尝试使用
GetExportedTypes()
缩小潜在类型的列表。除此之外,您无法加快迭代过程。但是,您可以包括一个插件mainfest,该插件mainfest将指定特定程序集中插件的确切类型:
<manifest>
<plugin type="FooBar.Plugins.BazPlugin, FooBar" />
</manifest>
我们的插件系统利用属性来识别插件类型。然后,我们只需扫描程序集以查找特定属性。和的解决方案:使用程序集级属性 简而言之,您需要添加一个新属性:
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple=true)]
class PluginAttribute : Attribute {
public PluginAttribute (Type type) {this.Type = type;}
public Type Type {get; private set;}
}
然后在程序集级别指定此属性:
[assembly:Plugin (typeof(Plugin1))]
[assembly:Plugin (typeof(Plugin2))]
然后查询程序集中的所有pluginAttribute:
Assembly a = ...;
PluginAttribute[] plugins =
(PluginAttribute[]) a.GetCustomAttributes (
typeof(PluginAttribute), true);
foreach (var plugin in plugins)
// plugin.Type is the type to use as a plugin
这比仅使用Assembly.GetTypes()
/Assembly.GetExportedTypes()
要快得多
[assembly:Plugin]
属性中列出的类型实际上需要
要加载,这可以显著减少内存量
已消耗(取决于程序集中类型的数量)。鉴于我对这个问题的评论,如果可以,请在执行其他操作时枚举另一个线程上的所有类型。然后,当您准备枚举所需的类型时,它应该至少快两个数量级,根据。这并不是问题的答案,但也许可以看看MEF:您的实际测试条件有多复杂?您使用的是
和还是和还是和或?我这样问是因为在我最慢的机器上,使用DotLisp解释器,枚举14807个类型需要0.322秒,使用BaseType=Component
获取公共类型需要0.458秒。哦,在这台速度较慢的机器上检查这个查询的编译LinqPad版本时,我看到了问题:在缓存类型
对象之前,甚至在后台构建对象之前,速度要慢得多:10961类型
在10.206秒内枚举!紧接着,查找组件只需0.03323秒。
Assembly a = ...;
PluginAttribute[] plugins =
(PluginAttribute[]) a.GetCustomAttributes (
typeof(PluginAttribute), true);
foreach (var plugin in plugins)
// plugin.Type is the type to use as a plugin