2009-08-11 41 views
2

我有一個定義的接口ISerializeDeserialize,以及一些類繼承了通用接口。我還有一些使用CodeDomProvider生成的程序集生成的程序集,它生成從相同接口繼承的類,但是使用特定的類型實現它。優化查找實現IInterface的所有類<T>以及那些使用特定類型明確實現的類

我想實現的是獲取泛型實現和實現特定類型的列表。您可以在下面的代碼中使用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(); 
} 

我可以拉在一起的一個功能,但我用兩個用於清晰度。問題是,這可以優化還是以更好的方式完成?

回答

3

不幸的是我不知道任何其他方式(我也不得不多次寫這樣的代碼)。

的一件事,你可以做的是使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(); 
} 
+0

它在第一循環這困擾我最檢查,請將.Name屬性,因爲它不是100 %。如果有人用相同的名稱創建了另一個接口,它可以匹配。猜猜我可以添加一些邏輯來檢查FullName。 –

+0

爲我的回答添加了更好的版本。 –

+0

謝謝..每天學點東西:) –