2017-07-21 16 views
0

這裏是我的代碼:如何通過類型名稱的對象轉換,並作爲參數傳遞給另一個方法

using System.Reflection; 
Public class ClassA 
{ 
    public ClassA() 
    { 
     ClassB classB = new ClassB(); 
     classB.UsingType = "ClassD"; 
     ClassB.Do(); 
    } 
} 
Public class ClassB 
{ 
    public string UsingType { get; set; } 
    public void Do() 
    { 
     ClassC classC = new ClassC(); 
     Type type = Type.GetType(UsingType); 
     Object obj = Activator.CreateInstance(type); 
     classC.Do(obj); // Error : cannot convert from 'object' to 'ClassD' 
    } 
} 
public class ClassC 
{ 
    public void Do(ClassD classD) // If I change "ClassD" to "Object" It works!! 
    { 
     //Do something with classD 
    } 
} 

我得到這個錯誤:「無法從‘對象’到‘D類’轉換。 「

如果我改變「做」法「ClassC」從「D類」參數設置爲「對象」的錯誤消失,然後我可以轉換到「D類」,並使用該參數。但那不是我想要的。

有沒有辦法通過「UsingType」字符串投「目標文件」到「D類」(在「ClassB的」的「做」的方法),並擺脫了編譯時錯誤的?

換句話說:(因爲「ClassA的」知道的類型名稱字符串,並將其傳遞到「ClassB的」)我如何從「對象」投給「ClassC」請求的類型?

+1

編譯器cn't知道其運行時類型'obj'實際上是。這些信息僅在實際執行*程序時才存在。因此,即使你能*至少在編譯期間通過使用運行時類型來推斷演員,你所得到的只是一個'object'而不是'ClassA'。這是唱反射的代價:你在編譯時會丟失關於實際時間的任何*信息,因此只能處理'object'。 – HimBromBeere

+0

我的直覺告訴我你的設計有缺陷。你能解釋你想要解決什麼問題嗎?或者你的要求是什麼? –

+0

我想要做的是在運行時通過知道類型名稱來實例化對象並將其傳遞給另一個方法。 –

回答

0

既然你確定objClassC型的,只需將其轉換爲預期的類型。

ClassC obj = (ClassC)Activator.CreateInstance(type); 
classC.Do(obj); 

爲了進一步解釋這是什麼一樣:Object是一個通用的類型,並且只具有屬性/方法是全局可用

它投射到一類的裝置(如ToString(),或GetHashCode()。)編譯器會嘗試轉換它,如果轉換失敗,則返回null

+0

問題是我不確定ClassB中的類型。 「ClassA」知道類型 –

+1

實際上,考慮到上面的代碼,如果轉換失敗,它將拋出異常。 'as'操作將返回null。 –

相關問題