如何动态投射对象

本文关键字:对象 动态 何动态 | 更新日期: 2023-09-27 18:35:49

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

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;,它将在执行时编译并找到正确的方法
  • 否则,请使用反射来查找并调用该方法。

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

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

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

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

((MyClassA)obj).Initialize();

((MyClassB)obj).Initialize();

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