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

Pau*_*ter 100 c# types casting typeof object

如果我有:

void MyMethod(Object obj) {   ...   }
Run Code Online (Sandbox Code Playgroud)

obj该如何演绎其实际类型?

Mar*_*ell 166

如果您知道实际类型,那么只需:

SomeType typed = (SomeType)obj;
typed.MyFunction();
Run Code Online (Sandbox Code Playgroud)

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

  • 反射
  • 实现一个众所周知的界面
  • 动态

例如:

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


Mak*_*Vi. 39

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

void MyMethod(Object obj, Type t)
{
    var convertedObject = Convert.ChangeType(obj, t);
    ...
}
Run Code Online (Sandbox Code Playgroud)

UPD:

这可能对你有用:

void MyMethod(Object obj)
{
    if (obj is A)
    {
        A a = obj as A;
        ...
    } 
    else if (obj is B)
    {
        B b = obj as B;
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这确实是一个无用的答案,不值得投票。如OP所要求的,对类型为object的对象的反射不会产生该对象的“实际类型”。另外,您的MyMethod逻辑有缺陷,因为obj可以是A类型,也可以是B类型。您的逻辑不提供“实际类型”(按OP的要求),它提供兼容的类型,不一定所需的类型。 (2认同)

alb*_*bin 10

怎么样

JsonConvert.DeserializeObject<SomeType>(object.ToString());
Run Code Online (Sandbox Code Playgroud)