如何优化此代码

时间:2011-05-16 04:52:21

标签: c# reflection c#-3.0

var type = typeof(TInterface);
        var types = AppDomain.CurrentDomain.GetAssemblies().ToList()
            .SelectMany(s => s.GetTypes())
            .Where(t => type.IsAssignableFrom(t));

此代码比我想要的慢。有人可以提出一种更优化的方法来用C#编写代码吗?

2 个答案:

答案 0 :(得分:2)

ToList()完全是多余的,尽管这不太可能导致任何放缓:

var type = typeof(TInterface);
var types = AppDomain.CurrentDomain.GetAssemblies()
        .SelectMany(s => s.GetTypes())
        .Where(t => type.IsAssignableFrom(t));

仅供参考,上述代码应相对快速,仅在您尝试通过types枚举.Net框架完成繁重工作的时候。

除此之外,如果不了解更多关于您要执行的操作的内容,则无需优化任何内容 - 上面将列出加载到当前域t的所有程序集中的所有类型typeof(TInterface).IsAssignableFrom(t)的枚举 - 如果加载了很多类型/程序集,那么我担心这需要一些时间。

你能告诉我们更多关于你要做什么的事吗?

答案 1 :(得分:2)

您正在迭代已加载/引用的所有程序集中的所有类型。但您想要的类型是您的类型,因此您知道它不在任何系统程序集中。例如,如果未在那里安装程序,则可以在全局程序集缓存中筛选出程序集:

var type = typeof(TInterface);
var types = AppDomain.CurrentDomain.GetAssemblies().Where(a => !a.GlobalAssemblyCache)
    .SelectMany(s => s.GetTypes())
    .Where(t => type.IsAssignableFrom(t));

如果您的应用程序安装在GAC中,您可以使用其他过滤策略将程序集限制为您自己的程序集。