【发布时间】:2023-03-21 09:51:01
【问题描述】:
我正在尝试使用 C# 反射从程序集中检索所有类型(比方说:从“ExecutingAssembly”),我可以检索所有显式定义的类型,包括我的泛型类型在程序集中定义。但我似乎无法检索 隐式 实例化的泛型类型(具体版本)。
例如,var types = Assembly.GetExecutingAssembly().GetTypes(); 这将检索所有显式定义的类型(在此程序集中定义的类、结构,包括通用类型,例如class MyGenericClass<T>)。
然而,在同一个程序集中,我实际上在我的代码中使用MyGenericClass<int>作为concrete类型来实际实例化对象(例如:MyGenericClass<int> myObject;),但是这个具体 MyGenericClass<int> 类型似乎不能被上面的代码检索到。
我想知道是否有任何实例化生成的类型实际上可以从程序集中检索,所以我以后可能会使用该类型进行一些代码生成工作。
如果它们不可检索,有什么设计建议吗?
提前谢谢你!
【问题讨论】:
-
具体类型在使用之前不会被创建。除了一些 AOT 场景外,运行时在实际命中引用它的代码之前并不知道您将创建一个新的
MyGenericClass<int>。 -
"...我可以使用那种类型..." - .NET 泛型设计的要点之一是它们必须使用其声明的类型约束允许的任何可能类型。您不需要其他人事先使用特定组合。
-
您真正想解决什么问题? 为什么您需要这些信息? “一些代码生成工作”实际上意味着什么?
-
您能否向我们展示一个您希望查看其类型信息的代码示例?
-
如果你有
public static MyGenericClass<T> CreateMyGenericClass<T>() { return new MyGenericClass<T>(); }方法,你想获得什么信息?你不知道调用者会传入什么。或者更糟糕的是,你的代码中某处有一些MakeGenericType()反射魔法?实际的封闭泛型类型将由运行时在运行时创建。你有一个 XY 问题。正如@canton 所说,说明您要解决的实际问题。
标签: c# generics reflection .net-assembly