2011-01-13 142 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。

本质上,动态类型被视为“无类型”对象。在编译时没有智能感知和类型检查。

相关问题