如何将C#对象拆分为动态类型

McG*_*gle 10 .net c# reflection casting dynamictype

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

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);
Run Code Online (Sandbox Code Playgroud)

显然我在这里很困惑.我知道我可以通过写出条件陈述来完成这项工作 -

if (obj.GetType() == typeof(TypeA)) obj = (TypeA)obj;
else if (obj.GetType() == typeof(TypeB)) obj = (TypeB)obj;
Run Code Online (Sandbox Code Playgroud)

- 但是有没有办法在运行时这样做?

编辑 我同意它似乎也许不是最好的设计选择,所以这是上下文.上面代码的要点是Mongo DB的Repository基类.我希望它能够处理不同类型的表.所以,someMethod()实际上是删除的 ; TypeA和TypeB是ObjectIDGuid ; 底部的代码是类型不可知的删除方法的一部分,它接受ID作为字符串; 和getObject()是一个解析ID参数的方法.

Jon*_*eet 20

如果您使用的是.NET 4和C#4,则可以使用dynamic以下内容:

dynamic obj = GetObject();
SomeMethod(obj);
Run Code Online (Sandbox Code Playgroud)

否则,您将不得不使用反射来查找和调用正确的方法.过载分辨率(非dynamic类型)在编译时执行.

(请注意,除非TypeATypeB是结构,你就不会拆箱反正...)