我定义了一个接口ISerializeDeserialize,一些类继承了泛型接口。我还使用CodeDomProvider生成一些代码生成的程序集,它生成从同一个接口继承的类,但使用特定的Type实现它。
我想要实现的是获取通用实现的列表以及实现特定类型的实现。你可以在下面的代码中让T = int。
到目前为止,为了获得所有类型I的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();
}
我可以在一个功能中将它们组合在一起,但为了清晰起见我使用了两个。问题是,这可以优化还是以更好的方式完成?
答案 0 :(得分: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();
}