声明一个对象,它可以是任何类型的C#
问题描述:
我正在寻找类似'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。
答
您可以通过两种方式来实现:
首先,你可以声明类型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();
} // ...
答
声明一个object
或使用dynamic
关键字作为别人说,或者,如果你知道一个接口或基类,所有可能的对象从派生,使用该类型:
IOption abc;
答
object abc; // :-)
或者是太简单?
答
您有几种选择来考虑和var
是不是其中之一。 1)让所有的选项类从一个抽象基类继承。 2)使所有的选项类从一个接口继承。
3)使用object
作为类型
4)使用dynamic
对象
这取决于你想在代码中这点后,用“ABC”做什么。
答
动态类型正是为了这个目的。他们的“类型”是动态的(这显然意味着在运行时)。
我不知道Objective-C,但它好像是id = dynamic。
本质上,动态类型被视为“无类型”对象。在编译时没有智能感知和类型检查。
我想给BoltClock的答案增加一个例子。他的回答完全正确。你可以在任何地方使用var关键字,比如var myDate = new DateTime(); var myBuilder = new StringBuilder(); ... – 2011-01-13 19:44:52
@Serkan Hekimoglu:你可以这样做,但是你不能单独声明`var myVar;`,它必须在声明时初始化。我把`var`与`object`混淆了。 – BoltClock 2011-01-13 19:51:45
@BoltClock :)你也困惑我 – 2011-01-13 20:01:11