声明一个可以是c#中任何类型的对象

时间:2011-01-13 19:40:39

标签: c# oop

我正在寻找类似于目标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;
}
...

我怎样才能在c#中做同样的事情? 谢谢, Nikil。

5 个答案:

答案 0 :(得分:9)

您可以通过两种方式执行此操作:

首先,您可以将类型声明为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(); 
} // ...

答案 1 :(得分:4)

object abc; // :-)

还是太简单了?

答案 2 :(得分:3)

动态类型正是出于此目的。他们的“类型”是动态的(这显然意味着在运行时)。

我不知道Objective-C但它似乎是id = dynamic。

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

答案 3 :(得分:1)

您需要考虑几种选择,var不是其中之一。

1)让所有Option类继承自抽象基类。

2)使所有Option类继承自Interface。

3)使用object作为类型

4)使用dynamic对象

这取决于你在代码中的这一点之后想要用'abc'做什么。

答案 4 :(得分:0)

声明object或使用其他人说的dynamic关键字,或者如果您知道所有可能对象派生自的接口或基类,请使用该类型:

IOption abc;