如何动态投射对象?

时间:2012-05-31 14:04:34

标签: c# casting

我很确定之前有人问过,但遗憾的是,我发现{唯一} 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,因为它的类型会动态更改。

如何动态投射?

2 个答案:

答案 0 :(得分:9)

三个选项:

  • 如果您控制这两个类,并且可以让它们实现包含您需要的所有内容的通用接口,那么执行此操作 - 并转换为接口
  • 如果您使用的是C#4和.NET 4,则可以使用动态类型 - 只需将变量声明为private dynamic obj;,它将在执行时编译并找到正确的方法
  • 否则,使用反射查找并调用该方法。

基于执行时间类型基本上强制转换没有意义,因为强制转换的一部分是给编译器更多信息......而你在这种情况下根本就没有。

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

答案 1 :(得分:0)

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

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

((MyClassA)obj).Initialize();

...

((MyClassB)obj).Initialize();

或者您可以创建一个具有Initialize方法的接口,并将obj定义为该接口。