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

时间:2012-09-02 07:18:28

标签: c# object types casting typeof

如果我有:

void MyMethod(Object obj) {   ...   }

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

10 个答案:

答案 0 :(得分:152)

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

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

答案 1 :(得分:35)

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

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

答案 2 :(得分:2)

这种方法可能不是最有效的,但是很简单并且可以完成工作。

它执行两个操作:首先调用.ToString(),它基本上是一个序列化,然后使用Newtonsoft nuget(必须必须安装)进行反序列化。

public T Format<T>(Object obj) =>
    JsonConvert.DeserializeObject<T>(obj.ToString());

答案 3 :(得分:1)

投射到实际类型很容易:

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

答案 4 :(得分:1)

在我看来,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将使用属性名称排列键。

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

如果现在是类型,则将其转换为真实类型,例如,它是从名为abc的类定向的。 你可以用这种方式调用你的函数:

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

如果你不知道它可以以不同的方式完成它的功能。总是不容易。但你可以通过它的签名以某种方式找到它。如果是这种情况,您应该告诉我们。

答案 7 :(得分:0)

JsonConvert.DeserializeObject(object.ToString());

答案 8 :(得分:0)

如果可能有多种类型,则方法本身不知道要转换的类型,但是调用者知道,您可以使用类似以下的内容:

setLoading(prevState => !prevState)

可以在括号后使用void TheObliviousHelperMethod<T>(object obj) { (T)obj.ThatClassMethodYouWantedToInvoke(); } // Meanwhile, where the method is called: TheObliviousHelperMethod<ActualType>(obj); 关键字添加对该类型的限制。

答案 9 :(得分:-1)

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