如何将 C# 对象取消加载为动态类型

本文关键字:加载 动态 类型 取消 对象 | 更新日期: 2023-09-27 18:30:43

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

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的存储库基类。 我希望它能够处理不同类型的表。 所以,某些方法()实际上是删除的;TypeA 和 TypeB 是 ObjectIDGuid;底部的代码是与类型无关的 remove 方法的一部分,该方法接受 ID 作为字符串;getObject() 是一种解析 ID 参数的方法。

如何将 C# 对象取消加载为动态类型

如果使用的是 .NET 4 和 C# 4,则可以将 dynamic 用于此目的:

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

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

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