C# - 通过反射创建通用基础 class 的所有子 class 实例

C# - Create instance of all sub classes of a generic base class via Reflection

我想创建所有 class 实例,它们是通用基础 class 的子 class 实例。我已经搜索了一段时间了。没有找到任何东西。

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 哪个为您做这种事情;

"The Managed Extensibility Framework or MEF is a library for creating lightweight, extensible applications. It allows application developers to discover and use extensions with no configuration required. It also lets extension developers easily encapsulate code and avoid fragile hard dependencies. MEF not only allows extensions to be reused within applications, but across applications as well."

有同样的问题,我就到这里了。 但也在寻找

所以我最终得到了合并这两个部分的代码草稿:

// 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);
    }