C# - 通过反射创建泛型基类的所有子类的实例
本文关键字:子类 实例 基类 泛型 反射 创建 | 更新日期: 2023-09-27 17:57:04
我想创建所有类的实例,这些类是泛型基类的子类。我已经搜索了一段时间了。什么也没找到。
public class BaseClass<T> { }
public class CustomSubClass: BaseClass<int> { }
我对泛型类型有问题。有人可以帮助我吗?
假设你有:
class BaseClass<T> { }
class CustomSubClass : BaseClass<int> { }
class CustomSubClass2 : BaseClass<string> { }
然后:
List<Type> allSubTypes = new List<Type>();
foreach(var assem in AppDomain.CurrentDomain.GetAssemblies())
{
var subTypes = assem.GetTypes().Where(x => x.BaseType != null
&& x.BaseType.IsGenericType
&& x.BaseType.GetGenericTypeDefinition() == typeof(BaseClass<>));
allSubTypes.AddRange(subTypes);
}
// CustomSubClass and CustomSubClass2
foreach (var type in allSubTypes)
{
object instance = Activator.CreateInstance(type);
}
听起来你正在实现某种插件系统。您可能想查看为您做这种事情的 MEF;
"托管可扩展性框架或MEF是一个用于创建轻量级、可扩展应用程序的库。它允许应用程序开发人员发现和使用扩展,而无需配置。它还允许扩展开发人员轻松封装代码并避免脆弱的硬依赖项。MEF 不仅允许扩展在应用程序内重用,还允许跨应用程序重用。
有同样的问题,我最终来到这里。但也要看这个答案。
所以我最终得到了这个代码草案,合并了这两个部分:
// Get all derivative class of BaseClass<T>
var allSubTypes = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(a=>a.GetTypes())
.Where(x => x.BaseType != null
&& !x.IsAbstract
&& (x.GetConstructor(Type.EmptyTypes) != null)
&& x.BaseType.IsGenericType
&& x.BaseType.GetGenericTypeDefinition() == typeof(BaseClass<>));
// and instantiate them
foreach (var type in allSubTypes)
{
object instance = Activator.CreateInstance(type);
}