【问题标题】:C# - Create instance of all sub classes of a generic base class via ReflectionC# - 通过反射创建通用基类的所有子类的实例
【发布时间】:2016-07-14 06:29:11
【问题描述】:

我想创建作为通用基类的子类的所有类的实例。我已经搜索了一段时间。什么都没找到。

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

我对泛型类型有疑问。谁能帮帮我?

【问题讨论】:

  • 到目前为止您尝试过什么?您是否尝试遍历所有类型并使用以下方法创建实例: object instance = Activator.CreateInstance(type); ?
  • 所有子类都位于同一个程序集中吗?
  • 所有子类都位于同一个程序集中。我曾尝试创建实例,但我收到一条消息说它无法创建实例,因为通用 T。

标签: c# generics system.reflection


【解决方案1】:

假设你有:

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

【讨论】:

  • 附加信息:无法创建 MYCLASS 实例,因为 Type.ContainsGenericParameters 为 true。
  • 如果你有一个构造函数,你能展示一下吗?编辑您的问题并添加它。它在我身边工作。
  • 啊,它对于一个有点不同的特定类失败了。它就像一个魅力! :-) 谢谢!
  • @redlaz 如果你想创建一个具有泛型类型参数的类。然后你必须使用type.MakeGenericType(typeof(int));
  • 是的。这是一个具有泛型类型的类。再次比你!
【解决方案2】:

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

“托管可扩展性框架或 MEF 是一个用于创建轻量级、可扩展应用程序的库。它允许应用程序开发人员发现和使用无需配置的扩展。它还允许扩展开发人员轻松封装代码并避免脆弱的硬依赖。MEF 不是只允许在应用程序内重用扩展,但也允许跨应用程序重用。”

【讨论】:

    【解决方案3】:

    有同样的问题,我结束了。 但也看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);
        }
    

    【讨论】:

      猜你喜欢
      • 2019-06-11
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 2017-04-10
      相关资源
      最近更新 更多