【问题标题】:How to unbox a C# object to dynamic type如何将 C# 对象拆箱为动态类型
【发布时间】:2012-04-23 01:22:30
【问题描述】:

我正在尝试做这样的事情:

void someMethod(TypeA object) { ... }

void someMethod(TypeB object) { ... }

object getObject()
{
    if (...) return new TypeA();
    else return new TypeB();
}

object obj = getObject();
(obj.GetType()) obj;  // won't compile
someMethod(obj);

显然我在这里感到困惑。我知道我可以通过写一个条件语句来完成这项工作——

if (obj.GetType() == typeof(TypeA)) obj = (TypeA)obj;
else if (obj.GetType() == typeof(TypeB)) obj = (TypeB)obj;

-- 但是在运行时没有办法做到这一点吗?

编辑 我同意这似乎不是最好的设计选择,所以这里是上下文。上面代码的重点是 Mongo DB 的 Repository 基类。我希望它能够处理不同类型的表格。所以, someMethod() 实际上是 remove;而TypeA和TypeB分别是ObjectIDGuid;底部的代码是与类型无关的 remove 方法的一部分,该方法接受 ID 作为字符串;而getObject()是解析ID参数的方法。

【问题讨论】:

  • 您将类型 T 与与之关联的运行时类型信息混为一谈:typeof(T)。它们不是一回事,不能相互替代。
  • 可能会有更好的设计选择,但您在帖子中忽略了代码的实际目标。如果您让我们知道您尝试使用此代码完成什么,也许我们可以为您提供更好的、完全不同的方式来编写您的问题的解决方案。
  • @Kirk Woll,我知道其中的区别,我只是想说明我想要做什么。
  • @John Fisher,添加了上下文。我认为这可能是“代码审查”交流的问题,但如果你有想法,我很乐意将它作为一个单独的问题打开。
  • 看看Massive。你会在那里找到很多好主意。

标签: c# .net reflection casting dynamictype


【解决方案1】:

如果您使用的是 .NET 4 和 C# 4,则可以为此使用 dynamic

dynamic obj = GetObject();
SomeMethod(obj);

否则,您将不得不使用反射来查找和调用正确的方法。重载解析(对于非dynamic 类型)在编译时执行。

(请注意,除非TypeATypeB 是结构,否则您无论如何都不会拆箱...)

【讨论】:

  • @RobertHarvey:没有给出问题的编写方式,它在同一类型中选择重载。
  • 我不知道重载解决方案扩展到 dynamic 对象的运行时类型。
  • @RobertHarvey:这就是dynamic 的全部要点——实际上,几乎一切都被推迟到执行时间,使用对象的实际类型。
  • @RobertHarvey:关于唯一没有扩展到dynamic 的是扩展方法;这些仅在编译时可用。
猜你喜欢
  • 1970-01-01
  • 2016-06-27
  • 1970-01-01
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多