5

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

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

2 回答 2

9

三个选项:

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

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

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

于 2012-05-31T14:06:42.540 回答
0

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

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

((MyClassA)obj).Initialize();

...

((MyClassB)obj).Initialize();

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

于 2012-05-31T14:08:22.423 回答