2015-02-06 65 views
0

實例使用C#反射/組裝/ Activator對象我有一個命名空間中定義一個類(我將省略的代碼):無法從字符串

namespace My.Business.Services 
{ 
    public class ProgressSender 
    { 
    } 
} 

該項目被保存爲一個DLL。在我的解決方案中的另一個項目中,我嘗試以各種方式安裝它(實際上這是我的app.config中的一個字符串),但它們都失敗了(它確實可以明確地在代碼中早期綁定類)。我已經包括My.Business.Services作爲參考程序太:

namespace My.Progress.Imaging 
{ 
    static class Program 
    { 
    static void Main(string[] args) 
    { 
     string exportItemNS = "My.Business.Services"; 
     string exportItemC = "ProgressSender"; 
     string exportItemFull = "My.Business.Services.ProgressSender"; 

     //value cannot be null 
     ProgressSender obj =  
     (ProgressSender)Activator.CreateInstance(Type.GetType(exportItemFull)); 

     //could not load type 'ProgressSender' from assembly 'My.Business.Services' 
     var obj=Activator.CreateInstance(exportItemNS, exportItemC); 

     //could not load type 'ProgressSender' from assembly 'My.Business.Services' 
     ProgressSender s=(ProgressSender)Activator.CreateInstance(null, exportItemFull); 

     //Loads ok but then classType is null 
     Assembly assembly; 
     assembly = Assembly.Load(exportItemNS); 
     Type classType = assembly.GetType(exportItemC); 

    } 
} 
} 

如果我得到相同的命名空間,甚至系統是一個類型的罰款:

Type t = Type.GetType("My.Progress.Imaging.Program"); 
t = Type.GetType("System.String"); 
+0

您是否還嘗試過'assembly.GetType(exportItemFull)'? – SimpleVar 2015-02-06 19:03:10

回答

2

你需要指定完整的裝配限定名稱。只有mscorlib和系統類型可以提供不帶程序集名稱的類型名稱。

所以你的情況:

「My.Business.Services.ProgressSender,My.Business.Services」

如果你的類型是在My.Business.Services.dll組裝。

請參閱https://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname(v=vs.110).aspx

+0

打了我一分鐘。是的,需要知道(尤其是如果lib還沒有加載)程序集就像類型一樣。 – 2015-02-06 19:15:32

+0

謝謝。使用Assembly Load還是Activator更好?這工作,但沒有其他方式,我寧願不必將我的字符串分成命名空間和完整的類名後,從xml讀取它 ProgressSender obj =(ProgressSender)Activator.CreateInstance(exporterItenNS,exportItemFull).Unwrap (); – 2015-02-06 19:26:24

+0

您已經將每種類型分開加載。如果你想避免真正的分裂,爲什麼不把它們全部保存爲xml或json,你可以用'namespace'和'name'屬性將它們作爲單獨的值來存儲? – SimpleVar 2015-02-06 19:28:30