【问题标题】:C# Get a list of all runtime constructed classes of a generic classC#获取泛型类的所有运行时构造类的列表
【发布时间】:2011-02-11 22:19:05
【问题描述】:

我正在尝试列出由泛型类创建的所有运行时构造的类。换句话说,如果我有课:

public GenericCls<T> {
    public void Reset() { ... }
    ...
}

我在不同的地方都有这样的代码:

GenericCls<int> gci = new GenericCls<int>();
GenericCls<String> gcs = new GenericCls<String>();
GenericCls<float> gcf = new GenericCls<float>();
...

我可以得到这样的东西吗?:

Type[] allconstructed = GetAllConstructed(typeof(GenericCls<>));

返回{GenericCls&lt;int&gt;,GenericCls&lt;String&gt;,GenericCls&lt;float&gt;,...}

该用例涉及一个通用分配器,它支持任何类型的对象分配(类似于new XXX(),但对垃圾收集器更好)。我不会详细说明,因为它只会使问题复杂化。基本上,我不会在编译时知道所有构造的类,因为该库是一个 dll,旨在与单独的代码项目一起使用。所以我需要某种形式的反思,我似乎在互联网上找不到。

Assembly.GetExecutingAssembly().GetExportedTypes() 只包含基本泛型类(即typeof(GenericCls&lt;&gt;)

typeof(GenericCls&lt;&gt;).GetGenericArguments() 只返回类型“T”,这不仅是无效类型,而且完全没用。

如果你只知道泛型类的类型,是否甚至可以找到泛型类的所有构造类? (typeof(GenericCls&lt;&gt;);) 我不确定“constructed”是否是正确的词——我想知道当前活动的所有具体的泛型派生类,或者所有这些将存在的类(不确定 C# 如何处理泛型构造幕后)。

【问题讨论】:

  • @Ani,你应该提交它作为答案,恕我直言。
  • 您所有未注册的帐户都已合并。请考虑将 OpenID 与此关联,或者如果您不想使用 OpenID,可以注册它。

标签: c# class generics reflection


【解决方案1】:

@David Mårtensson:你的回答给了我一个想法。我可以在任何非泛型类中创建一个静态类型列表,并在构造每个构造类时注册它(当 T 已知时)。 即

static public class ConcreteList {
    static public List<Type> concrete;
}
public class GenericCls<T> {
    static GenericCls() {
        ConcreteList.concrete.Add(typeof(GenericCls<T>));
    }
}

我使用ConcreteList.concrete[x].GetGenericArguments() 进行了检查,它正在工作。哦,快。

【讨论】:

  • 看看我是如何编辑你的评论的,看看如何正确地格式化代码。代码需要缩进 4 行。 &lt;Code&gt; 标签并不像你想象的那样工作。
  • 如果你得到它的工作,请确保将你的答案标记为已接受,以便其他人知道哪个解决方案解决了它:D
  • 如果这已经解决了您的问题,请将其标记为正确答案。
【解决方案2】:

您可以使用工厂类来创建实例,这样工厂类可以保存所有已创建类的列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    相关资源
    最近更新 更多