C# 如何将对象强制转换为其实际类型?

C# 如何将对象强制转换为其实际类型?,c#,object,types,casting,typeof,C#,Object,Types,Casting,Typeof,如果我有: void MyMethod(Object obj) { ... } 如何将obj转换为实际类型?转换为实际类型很简单: void MyMethod(Object obj) { ActualType actualyType = (ActualType)obj; } 如果您知道实际类型,那么只需: SomeType typed = (SomeType)obj; typed.MyFunction(); 如果您不知道实际的类型,那么:不知道,不知道。您必须使用以下其中一

如果我有:

void MyMethod(Object obj) {   ...   }

如何将obj转换为实际类型?

转换为实际类型很简单:

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;
        ...
    }
}
如果您的
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);
公共类Foo{
公共整型条{get;set;}
公共int Baz{get;set;}
}
动态foo=新的MyDynamicObject();
foo.Bar=5;
foo.Baz=6;
初始化(cfg=>{});
var result=Mapper.Map(foo);
结果:巴应相等(5);
结果:Baz应达到6级;
动态foo2=Mapper.Map(结果);
foo2.Bar.应等于(5);
foo2.Baz.ShouldEqual(6);
类似地,您可以直接从字典映射到对象,AutoMapper会将键与属性名对齐

更多信息如何

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

如果可以使用多个类型,则方法本身不知道要强制转换的类型,但调用方知道,您可以使用以下方法:

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

// Meanwhile, where the method is called:
TheObliviousHelperMethod<ActualType>(obj);
void TheObliviousHelperMethod(objectobj){
(T) obj.您想要进入的类方法();
}
//同时,在调用方法的地方:
奥布利维奥瑟尔佩尔莫德(obj);

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

编译时已知类型吗?您希望从中实现什么?请告诉我们您想要实现什么,而不是您期望如何实现它。@JonSkeet:我希望能够从对象调用函数。当前
obj.MyFunction()
不编译,即使我知道真实对象确实有该函数。@PaulLassiter:如果你不知道类型,是什么声明了
MyFunction
方法?如果你想在这个对象上调用一个方法,为什么不实现一个接口并在你的方法MyMethod(IMyinterface obj)中调用它?这是不合逻辑的。你实际上不知道真正的类型。你应该怎么做?Swift中的等效语法是什么?Nevermind,为类型转换找到
as
,并使用
type(of:ClassName)
函数检查实例类型。object类型的对象的反射不会产生对象的“实际类型”,正如OP所要求的那样,您的MyMethod逻辑有缺陷,因为obj可以是类型A,也可以是类型B。您的逻辑不提供“实际类型”(根据OP的请求)——它提供了兼容的类型,而不一定是当时所需的类型。请使用obj.GetType()。这肯定会返回它的实际类型。我们已经知道“类型”。他希望将其解析为“T”@user12637955这实际上是一个有效的答案,但由于装箱和拆箱(即object->ToString()->到具体类型),因此具有更大的复杂性。更准确地说,它应该是这样的:
var myType=JsonConvert.DeserializeObject(object.ToString())
JsonConvert.DeserializeObject<SomeType>(object.ToString());
void TheObliviousHelperMethod<T>(object obj) {
    (T)obj.ThatClassMethodYouWantedToInvoke();
}

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