2012-02-05 62 views
0

我想魔術會發生這樣的...

.net中是否可以通過類字符串名稱聲明變量,但沒有直接的類名?

class SomeClass {} 

public static void main() 

    MagicFunctionOrMacrosOrSomethingThatGetTypeOf("SomeClass") some_var = null;<br /> 
} 

也許是瘋狂的,但是這可能嗎?
我需要它來避免瘋狂的大型開關情況,因爲有很多類,但是在某些代碼點無法告訴要創建什麼類。

讓我們有一個例子:
我有基類:
類基類{}

有很多的子類:
類class1:基類{}
類class2:基類{}
...
類classn:基類{}

有一些來自外部的標誌到事件處理程序:
string class_name; //實際上我使用int標誌,它應該與字典中的字符串名稱相關聯。

已被迫做出這樣的:

switch(class_name) 

    case "class1": 
     class1 some_class = new class1(); 
     some_class.RunHandler(); 
     break; 
    case "class2": 
     class2 some_class = new class2(); 
     some_class.RunHandler(); 
     break; 
    case "classn": 
     classn some_class = new classn(); 
     some_class.RunHandler(); 
     break; 
    } 


我想要的東西,以取代大switch語句是這樣的:

MagicFunctionOrMacrosOrSomethingThatGetTypeOf(class_name) some_var = null; 
... some initialization actions with some_var 
some_var.Build(); 
some_var.RunHandler(); 

哦,我...

+0

我在這裏看到的這五個tag,但沒有接近被問什麼...... – Chandu 2012-02-05 16:07:48

+0

對不起,但我不知道什麼標籤可以描述這種怪異的事情
但如果看到問題的話,所有的標籤適合問題 – Kosmos 2012-02-05 16:09:00

+0

您必須用適合所有可能性的基本類型聲明該變量。在最壞的情況下,這是'對象'。它可能是「動態」的。你打算如何創建對象? – 2012-02-05 16:13:04

回答

0

你哈有兩個問題:

  1. 給定用戶輸入,你想實例化一個不同類的對象。爲此,您需要用戶輸入和.NET類型名稱之間的映射。對於第一種:您可以使用約定 - 確保類型名稱與輸入匹配;或者你可以使用一個Dictionary<string,type>,並填充它;或者你可以給每個類添加一個屬性,顯示它處理的是哪個「動詞」。完成之後,您可以使用Activator.CreateInstance(在運行時)創建未知類的實例。這返回object
  2. 調用未知對象上的方法。爲類定義一個基類或公共接口(例如IRunnable或其他),或使用dynamic,這可以讓您輸入鴨子。
+0

謝謝,Activator.CreateInstance的東西正是我想要的東西 – Kosmos 2012-02-06 06:28:23

相關問題