是否可以将反射类型的列表强制转换为其原始强类型对象

本文关键字:转换 原始 对象 强类型 列表 反射 类型 是否 | 更新日期: 2023-09-27 18:35:07

从下面代码的第二行,我检索到一个类型列表。我想将其作为IBusinessObject的列表返回。这可能吗?如果是这样,我将如何去做?

public List<IBusinessObject> RetrieveAllBusinessObjects()
{
    var businessObjectType= typeof(IBusinessObject);
    List<Type> implementationsOfBusinessObject = AppDomain.CurrentDomain.GetAssemblies()
         .SelectMany(s => s.GetTypes())
         .Where(businessObjectType.IsAssignableFrom).ToList();
    return ?;
}

是否可以将反射类型的列表强制转换为其原始强类型对象

这里是一个可能的实现,它假定所有类型都有一个默认构造函数。

public List<IBusinessObject> RetrieveAllBusinessObjects()
{
    var businessObjectType= typeof(IBusinessObject);
    List<Type> implementationsOfBusinessObject = AppDomain.CurrentDomain.GetAssemblies()
         .SelectMany(s => s.GetTypes())
         .Where(businessObjectType.IsAssignableFrom).ToList();
    return implementationsOfBusinessObject.Select(t => (IBusinessObject)Activator.CreateInstance(t)).ToList();
}

我还建议检查类型是否是一个类而不是抽象的。

通常,在处理此类场景时,最好使用可以解决所有依赖项的依赖项注入容器。例如,温莎城堡作为类型化工厂设施,可用于解析实现特定接口的所有实例。看看 http://docs.castleproject.org/Windsor.Typed-Factory-Facility-interface-based-factories.ashx 和 http://docs.castleproject.org/Windsor.Resolvers.ashx