當我列出當前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儘管如此,仍然在尋找一個優雅的解決方案。 –