如何将 Object 转换为其实际类型?

如果有:

void MyMethod(Object obj) {   ...   }

如何将 obj强制转换为它的实际类型?

445296 次浏览

铸造成实际的类型很容易:

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

如果你知道实际的类型,那么只要:

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

如果你不知道实际的类型,那么: 不是真的,不。你必须使用:

  • 反思
  • 实现一个众所周知的接口
  • 充满活力

例如:

// 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();

我不认为你可以(没有反思) ,你应该提供一个类型的功能,以及:

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;
...
}
}
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 );
}

如果您的 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();
}

如果您现在的类型,例如它是从名为 abc 的类定向的,那么将它转换为它的实际类型。 你可以这样调用你的函数:

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

如果你不知道函数,可以用另一种方法来完成。总是不容易。但是你可以通过它的签名找到它。如果这是你的案子,你应该告诉我们。

在我的例子中,AutoMapper 工作得很好。

AutoMapper 不需要任何明确的配置就可以映射到/从动态对象:

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 将使用属性名称对键进行排列。

更多信息

怎么样

JsonConvert.DeserializeObject<SomeType>(object.ToString());

如果可能存在多个类型,那么方法本身并不知道要强制转换的类型,但是调用方知道,您可以使用如下方法:

void TheObliviousHelperMethod<T>(object obj) {
(T)obj.ThatClassMethodYouWantedToInvoke();
}


// Meanwhile, where the method is called:
TheObliviousHelperMethod<ActualType>(obj);

可以使用括号后面的 where关键字添加对类型的限制。

也可以使用 模式匹配

void MyMethod(Object obj) {


if(obj is SomeType myVar){
myVar.MyFunction();
}
}

另一个选择是序列化它,然后反序列化它作为您想要的对象。 JsonConvert.DeserializeObject<OtherType>(JsonConvert.SerializeObject(obj));