C# - 通过Reflection

时间:2016-07-14 06:29:11

标签: c# generics system.reflection

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

public class BaseClass<T> { }
public class CustomSubClass: BaseClass<int> { }

我遇到泛型类型的问题。谁可以帮助我?

3 个答案:

答案 0 :(得分:2)

假设你有:

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

答案 1 :(得分:0)

听起来你正在实现某种插件系统。你可能想看看MEF为你做这种事情;

&#34; Managed Extensibility Framework或MEF是一个用于创建轻量级,可扩展应用程序的库。它允许应用程序开发人员发现和使用不需要配置的扩展。它还允许扩展开发人员轻松封装代码并避免脆弱的硬依赖。 MEF不仅允许在应用程序中重用扩展,还允许在应用程序之间重用扩展。&#34;

答案 2 :(得分:0)

同样的问题,我到这里结束。 但也要看this answer

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

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