当我列出当前AppDomain中的所有类型时,我会看到泛型类型与泛型占位符。但是,如果我用一个类型实例化我的泛型类型,然后列出appDomain中的所有类型,我没有看到新创建的闭合类型。列出运行时从开放泛型类型创建的已关闭类型
在下面的例子中,产量只有:
Foo`1[T]
我在寻找使密闭型:
Foo`1[System.Int32]
有没有办法看到封闭类型的运行时有基于我的开放泛型类型为我创建?
class Foo<T>
{
}
class Program
{
static void Main(string[] args)
{
var tmp = new Foo<int>();
ListTypes();
}
private static void ListTypes()
{
var types = from assembly in AppDomain.CurrentDomain.GetAssemblies()
from type in assembly.GetTypes()
where type.Name.Contains("Foo")
select type;
foreach (var type in types)
Console.WriteLine(type.ToString());
}
}
我也试图找到所有类型的泛型参数,希望发现封闭类型。
class Foo<T>
{
}
class Bar
{
}
class Program
{
static void Main(string[] args)
{
var tmp = new Foo<Bar>();
ListTypes();
}
private static void ListTypes()
{
var types = from assembly in AppDomain.CurrentDomain.GetAssemblies()
from type in assembly.GetTypes()
where type.IsGenericType
&& type.GetGenericArguments().Contains(typeof(Bar))
select type;
foreach (var type in types)
Console.WriteLine(type.ToString());
}
}
这只是为了满足我的好奇心。
如果我理解正确,这个反射将简单地获取在元数据中定义的类型,在您的情况下只包含泛型类型定义。由于特定类型可以在运行时从泛型类型动态构建(再次使用反射,传递泛型参数) - 您可以看到无法将它们放入元数据中......所以,其他一些机制(不是元数据探索)必须用于查找创建的特定类型。 –
我明白了。这就解释了为什么我看不到在运行时创建的类型,它们不在反射查询的元数据中。我想知道其他机制会是什么? –
在mscorlib中有一个名为TypeNameParser的私有类型,它有一个返回字符串数组的GetNames方法,但是当我尝试在反射下使用它时,我收到致命错误,提醒我对COM对象和互操作知之甚少,并且通常我不应该在mscorlib中使用私有类型:-P尽管如此,仍然在寻找一个优雅的解决方案。 –