繁体   English   中英

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM