2012-05-31 45 views
5

我很确定这是以前问的,但不幸的是,我发现的唯一的东西是this这对我来说并不是解决方案。在我目前的项目我做这样的事情:如何动态地投射物体?

private object obj; 

private void Initialize() 
{ 
    obj.Initialize(); 
} 

private void CreateInstanceA() 
{ 
    obj = Activator.CreateInstance(typeof(MyClassA)); 
} 

private void CreateInstanceB() 
{ 
    obj = Activator.CreateInstance(typeof(MyClassB)); 
} 

,因为我还没有投obj因为它的类型是动态变化的此代码不能当然的工作。

我该如何动态投射它?

+4

看来,这不会是最好的方式去做事情。一种代码味道给我。你想要完成什么更大的背景? – FishBasketGordo

+0

除了初始化它,你还打算用'obj'做什么? –

+0

@RaymondChen我刚刚做了简单的WinForm项目来测试我的类库。 – Leri

回答

9

三个选项:

  • 如果您可以控制类,你可以让他们实现一个共同的接口,其中包括你需要的一切,然后做到这一点 - 和强制转换为界面
  • 如果你使用C#4和.NET 4,您可以使用动态类型 - 只需将变量声明为private dynamic obj;,并且它将在执行时编译并找到正确的方法
  • 否则,使用反射来查找和调用方法。

基本上铸造基于执行时间类型没有意义,铸造点的部分是给编译更多信息......你根本就没有在这个案例。

第一种选择是迄今为止最好的,如果你可以实现它。

+1

依赖注入怎么样 –

+1

没有接口的依赖注入/抽象基类?怎么样?如果可以定义接口,场景首先就足够了 – Tilak

+0

与接口相反,基类不会更好吗?这是* is-a *(抽象类),与* can-do *(接口)相反。假设类型在性质上类似 – mattytommo

0

我假设CreatInstanceB()实际上应该使用MyClassB,对吗?

在这种情况下,你可以使用:

((MyClassA)obj).Initialize(); 

...

((MyClassB)obj).Initialize(); 

或者你可以把它有一个初始化方法的接口和定义的obj作为接口。

+0

我认为,在初始化方法中,MyClassA或MyClassB未知,这是问题中的要点 – Tilak

+0

是的,您是对的。我编辑了问题。建议使用@JonSkeet,最好使用'dynamic'关键字。 – Leri

+0

没错,错过了。我们总可以依靠Skeet先生。 – Slugart