Оптимизируйте поиск всех классов, реализующих IInterface <T>, и тех, которые явно реализуют его с определенным типом - PullRequest
2 голосов
/ 11 августа 2009

У меня определен интерфейс ISerializeDeserialize и некоторые классы наследуют общий интерфейс. У меня также есть некоторые сгенерированные кодом сборки, использующие CodeDomProvider, который генерирует классы, унаследованные от того же интерфейса, но реализующие его с определенным типом.

Чего я хочу добиться, так это получить список универсальных реализаций и реализаций определенного типа. Вы можете указать T = int в приведенном ниже коде.

Чтобы получить все классы, реализующие ISerializeDeserialize некоторого типа, у меня пока есть следующий код:

private List<Type> GetListOfGenericSerializers()
{
    Type interfaceGenricType = typeof(ISerializeDeserialize<T>);

    var serializers = from assembly in AppDomain.CurrentDomain.GetAssemblies()
                      from genericType in assembly.GetTypes()
                      from interfaceType in genericType.GetInterfaces()
                          .Where(iType => (iType.Name == interfaceGenricType.Name && genericType.IsGenericTypeDefinition))
                      select genericType;

    return serializers.ToList();
}

private List<Type> GetListOfTypeImplementedSerializers()
{
    Type interfaceGenricType = typeof(ISerializeDeserialize<T>);

    var serializers = from assembly in AppDomain.CurrentDomain.GetAssemblies()
                      from implementedType in assembly.GetTypes()
                      from interfaceType in implementedType.GetInterfaces()
                          .Where(iType => iType == interfaceGenricType)
                      select implementedType;

    return serializers.ToList();
}

Я мог бы собрать их в одну функцию, но для ясности я использую две. Вопрос в том, можно ли это оптимизировать или это сделать лучше?

1 Ответ

3 голосов
/ 12 августа 2009

К сожалению, я не знаю другого пути (мне также приходилось писать такой код более одного раза).

Единственное, что вы можете сделать, это сделать Where в первом методе более приятным:

private List<Type> GetListOfGenericSerializers()
{
  Type interfaceGenricType = typeof(ISerializeDeserialize<>);

  var serializers =
    from assembly in AppDomain.CurrentDomain.GetAssemblies()
    from genericType in assembly.GetTypes()
    from interfaceType in genericType.GetInterfaces()
    where genericType.IsGenericTypeDefinition &&
          interfaceType.IsGeneric &&
          interfaceType.GetGenericTypeDefinition() == interfaceGenericType
    select genericType;

  return serializers.ToList();
}
...