如何动态投射对象?

我很确定之前有人问过,但不幸的是,我发现的唯一一件事就是这对我来说不是解决方案。 在我目前的项目中,我做了类似的事情:

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因为它的类型动态变化。

我该如何动态投射?

三种选择:

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

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

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

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

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

 ((MyClassA)obj).Initialize(); 

 ((MyClassB)obj).Initialize(); 

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