2016-07-11 58 views
3

我有一個只有類名的字符串列表。我需要使用Activator創建它們的實例,但所有這些實例都可以位於不同的命名空間中。類可以在未來移入另一個名稱空間,所以我無法對其進行硬編碼。如何在.net內核中使用反射來查找類的名稱空間?

+0

你鎖定在具有'string'的列表,或者你可以有'Type',而不是一個列表?如果你只有'字符串',你想如何處理多於一種類型(使用不同名稱空間)的情況? –

+0

不幸的是我被鎖定了。類的列表來自文本文件,我需要創建適當的對象。 – MKasprzyk

+0

一定要檢查出這個線程以及:如何獲取命名空間中的所有類?(https://stackoverflow.com/questions/949246/how-to-get-all-classes-within-namespace/949285# 949285) –

回答

4

如果你知道你永遠不會有多種類型與居住在不同的命名空間相同的名稱,你可以遍歷在組件和過濾器的類型名稱的所有類型。例如,這個工程:

var typenames = new[] { "String", "Object", "Int32" }; 

var types = typeof(object).GetTypeInfo().Assembly 
    .GetTypes() 
    .Where(type => typenames.Contains(type.Name)) 
    .ToArray(); // A Type[] containing System.String, System.Object and System.Int32 

這不一定會打破,如果你有多種類型具有相同的名稱,但你會得到所有的人都在列表中。

+0

它不適用於.Net核心。 'Assembly沒有GetAssembly的定義.' – MKasprzyk

+0

它可以工作,但你可能需要添加一個框架程序集依賴項到你的project.json。給我幾分鐘,我會看看我能弄清楚哪一個。 –

+0

@MKasprzyk與網絡核心,你可以使用'typeof(object).GetTypeInfo()。Assembly'來獲得程序集。 –

1

你可以得到所有類型的組件,並找到一個有問題的名稱。

var type = assembly.GetTypes().FirstOrDefault(x => x.Name == name); 

注意:名稱可能不是唯一的。在這種情況下,除非對命名空間8e.g有一些猜測,否則你沒有機會找到正確的類型。可能的命名空間的列表,命名空間等的「黑名單」)

相關問題