2011-01-13 112 views
1

我正在尋找類似'id'的目標c中的實現,它可以是運行時的任何類型。是否有可能在c#中做到這一點?聲明一個對象,它可以是任何類型的C#

讓我解釋一下我的要求

id abc;// a common type which can hold any object during runtime 
if(cond1) 
{ 
Option1 opt1 = new Option1();//opt1 is an object of user defined class Option1 
abc = opt1; 
} 
else if(cond2) 
{ 
Option2 opt2 = new Option2(); 
abc = opt2; 
} 
... 

我怎樣才能做到在C#中一樣嗎? 謝謝, Nikil。

+0

我想給BoltClock的答案增加一個例子。他的回答完全正確。你可以在任何地方使用var關鍵字,比如var myDate = new DateTime(); var myBuilder = new StringBuilder(); ... – 2011-01-13 19:44:52

+0

@Serkan Hekimoglu:你可以這樣做,但是你不能單獨聲明`var myVar;`,它必須在聲明時初始化。我把`var`與`object`混淆了。 – BoltClock 2011-01-13 19:51:45

+0

@BoltClock :)你也困惑我 – 2011-01-13 20:01:11

回答

7

您可以通過兩種方式來實現:

首先,你可以聲明類型object。這將允許您爲該類型分配任何內容。但是,請注意,如果將值類型分配給對象引用,它將被裝箱。

例如:

object abc; 
if(cond1) 
{ 
Option1 opt1 = new Option1();//opt1 is an object of user defined class Option1 
// Assignment works, but you can't call a method or prop. defined on Option1 
abc = opt1; 
} // ... 

第二種選擇,這需要C#4,是將其聲明爲dynamic。這將允許您實際調用對象的方法和屬性,就好像它是「真實」類型一樣。如果方法調用不存在,則在運行時會失敗,但在編譯時會成功。

例如:

dynamic abc; 
if(cond1) 
{ 
Option1 opt1 = new Option1();//opt1 is an object of user defined class Option1 
// Assignment works 
abc = opt1; 

// This will work if Option1 has a method Option1Method()! 
// If not, it will raise an exception at run time... 
abc.Option1Method(); 
} // ... 
0

聲明一個object或使用dynamic關鍵字作爲別人說,或者,如果你知道一個接口或基類,所有可能的對象從派生,使用該類型:

IOption abc; 
4
object abc; // :-) 

或者是太簡單?

1

您有幾種選擇來考慮和var是不是其中之一。 1)讓所有的選項類從一個抽象基類繼承。 2)使所有的選項類從一個接口繼承。

3)使用object作爲類型

4)使用dynamic對象

這取決於你想在代碼中這點後,用「ABC」做什麼。

3

動態類型正是爲了這個目的。他們的「類型」是動態的(這顯然意味着在運行時)。

我不知道Objective-C,但它好像是id = dynamic。

本質上,動態類型被視爲「無類型」對象。在編譯時沒有智能感知和類型檢查。

相關問題