如何将对象转换为其实际types?

如果我有:

void MyMethod(Object obj) { ... } 

我怎么能obj到什么样的实际types?

如果你知道实际的types,那么只是:

 SomeType typed = (SomeType)obj; typed.MyFunction(); 

如果你不知道实际的types,那么:不是真的,不是。 您将不得不使用以下之一:

  • reflection
  • 实现一个众所周知的界面
  • dynamic

例如:

 // reflection obj.GetType().GetMethod("MyFunction").Invoke(obj, null); // interface IFoo foo = (IFoo)obj; // where SomeType : IFoo and IFoo declares MyFunction foo.MyFunction(); // dynamic dynamic d = obj; d.MyFunction(); 

我不认为你可以(不是没有反思),你也应该为你的函数提供一个types:

 void MyMethod(Object obj, Type t) { var convertedObject = Convert.ChangeType(obj, t); ... } 

UPD

这可能对你有用:

 void MyMethod(Object obj) { if (obj is A) { A a = obj as A; ... } else if (obj is B) { B b = obj as B; ... } } 

投射到实际的types很容易:

 void MyMethod(Object obj) { ActualType actualyType = (ActualType)obj; } 

如果MyFunction()方法仅在一个类(及其后代)中定义,请尝试

 void MyMethod(Object obj) { var o = obj as MyClass; if (o != null) o.MyFunction(); } 

如果您在定义要调用的函数的无关类中有大量的数据,则应定义一个接口并让您的类定义该接口:

 interface IMyInterface { void MyFunction(); } void MyMethod(Object obj) { var o = obj as IMyInterface; if (o != null) o.MyFunction(); } 
 Implement an interface to call your function in your method interface IMyInterface { void MyinterfaceMethod(); } IMyInterface MyObj = obj as IMyInterface; if ( MyObj != null) { MyMethod(IMyInterface MyObj ); } 

如果你现在把types转换为真正的types,例如它是从名为abc的类来的。 你可以这样调用你的函数:

 (abc)(obj)).MyFunction(); 

如果你不知道这个function可以以不同的方式完成。 总是不容易。 但是你可以通过签名来find它。 如果这是你的情况,你应该让我们知道。

在我的情况下,AutoMapper运作良好。

AutoMapper可以映射到/从dynamic对象没有任何明确的configuration:

 public class Foo { public int Bar { get; set; } public int Baz { get; set; } } dynamic foo = new MyDynamicObject(); foo.Bar = 5; foo.Baz = 6; Mapper.Initialize(cfg => {}); var result = Mapper.Map<Foo>(foo); result.Bar.ShouldEqual(5); result.Baz.ShouldEqual(6); dynamic foo2 = Mapper.Map<MyDynamicObject>(result); foo2.Bar.ShouldEqual(5); foo2.Baz.ShouldEqual(6); 

同样,您可以直接从字典映射到对象,AutoMapper将排列具有属性名称的键。

更多信息https://github.com/AutoMapper/AutoMapper/wiki/Dynamic-and-ExpandoObject-Mapping