Как оптимизировать этот код - PullRequest
1 голос
/ 16 мая 2011
var type = typeof(TInterface);
        var types = AppDomain.CurrentDomain.GetAssemblies().ToList()
            .SelectMany(s => s.GetTypes())
            .Where(t => type.IsAssignableFrom(t));

Этот код работает медленнее, чем хотелось бы.Может кто-нибудь предложить более оптимальный способ кодирования этого в C #?

Ответы [ 2 ]

2 голосов
/ 16 мая 2011

Вы перебираете все типы во всех сборках, на которые вы загрузили / на которые ссылались.Но тип, который вы хотите, - это ваш тип, так что вы знаете, что его нет ни в одной из системных сборок.Например, вы можете отфильтровать сборки в глобальном кэше сборок, если ваша программа там не установлена:

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

Вы можете использовать другие стратегии фильтрации, чтобы ограничить сборки своими, если приложение установленоGAC.

2 голосов
/ 16 мая 2011

ToList() полностью избыточен, хотя это вряд ли вызовет какое-либо замедление:

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

К вашему сведению, приведенный выше код должен быть относительно быстрым, его только в точкекогда вы пытаетесь с помощью types перечислить, что .Net Framework делает тяжелую работу.

Кроме того, оптимизировать нечего, не зная больше о том, что вы пытаетесь сделать - вышеприведенное получает перечислениевсех типов t во всех сборках, загруженных в текущий домен, где typeof(TInterface).IsAssignableFrom(t) - если загружено много типов / сборок, то, боюсь, это займет некоторое время.

Можетвы расскажете нам больше о том, что вы пытаетесь сделать?

...