2011-01-13 11 views
1

私は実行時に任意の型であることができる目的cの型 'id'に似た実装を探しています。任意のタイプのオブジェクトを宣言することができます#

は、私は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; 
} 
... 

私の要件を説明しましょうか?ありがとうございます。 Nikil。

+0

BoltClockの回答に例を追加します。彼の答えは全く真実だ。 var myDate = new DateTime();のようにどこでもvarキーワードを使用できます。 var myBuilder =新しいStringBuilder(); ... –

+0

@Serkan Hekimoglu:そうすることはできますが、 'var myVar; 'だけを宣言することはできません。それは宣言時に初期化する必要があります。私は 'var'を' object'と混同しました。 – BoltClock

+0

@BoltClock :)あなたも私を混乱させた –

答えて

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を必要とする第2のオプションは、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

ありがとうございました。 「ダイナミック」はまさに私が探しているものです。残念ながら私はVS 2010を持っていません。 – Nikil

+0

@Nikil:Express Editionは無料で入手できます:http://www.microsoft.com/express/Downloads/ –

0

objectを宣言したり他の人が言うようにdynamicキーワードを使用するか、またはすべてのあなたの可能なオブジェクトから派生インターフェイスまたは基本クラスを知っていれば、その型を使用します。

IOption abc; 
+0

var abc; //それはできません。 – gsharp

+0

@gsharp:Bah、私は 'var'と' object'を混在させました。あなたに+1 – BoltClock

4
object abc; // :-) 

またはそれがあります単純すぎます?次の2つの方法でこれを行うことができます

1

あなたが考慮すべきいくつかの選択肢を持っているとvarはそのうちの一つではありません。

1)すべてのOptionクラスを抽象基本クラスから継承します。

2)すべてのOptionクラスをInterfaceから継承します。

3)タイプ

4としてobjectを使用)がdynamicオブジェクトを使用し

それはあなたがコードでこの時点の後に「ABC」で何をしたいかに依存します。

3

ダイナミックタイプはまさにこの目的のためです。彼らの "タイプ"は動的です(明らかに実行時を意味します)。

私はobjective-Cについてよくわかりませんが、id = dynamicのようです。

本質的に、ダイナミックタイプは「タイプなし」オブジェクトとして扱われます。インテリセンスはなく、コンパイル時には型チェックも行われません。