在运行时将对象转换为另一种类型

时间:2015-03-09 13:34:31

标签: c# casting

void A(object o)
{
    ...
    Assembly a = Assembly.LoadFile(...);
    Type t = a.GetType(@"namespace.className");
    MethodInfo mi = t.GetMethod(@"MethodName");
    mi.Invoke(instace, new Object[] {o});
    ....         
}

我需要调用的方法接受另一种类型,我需要将该对象强制转换为该类型,但是,该类型仅在运行时才知道,那么我可以将对象转换/转换为仅在运行时已知的另一种类型吗?我只能改变方法A.

谢谢。

4 个答案:

答案 0 :(得分:1)

Reflection API仅处理object引用。转换引用是对该引用的操作。它不会以任何方式影响对象。

因此,没有必要在这里施展任何东西。只需将o传递给Invoke,就像您已经在做的那样。 Reflection API验证o的类型并将其传递给您要调用的方法。

答案 1 :(得分:1)

MethodInfo.Invoke(object instance, object[] arguments)是动态调用。这意味着,铸造是自动进行的。如果抛出InvalidCastException,则传递错误的参数或从内部代码抛出异常,而不是由传递给参数的对象引起的。

答案 2 :(得分:0)

这是我在需要几个类似消息时使用的代码,需要不同的处理。 Ordertype是自定义订单对象的Type实例。

            var _ot = Activator.CreateInstance(ordertype);
            var _otconvert = ordertype.GetMethod("ConvertRequestPayload");

            object[] _params = new object[] {message};

            var objectf = _otconvert.Invoke(_ot, _params);

            var _as = Activator.CreateInstance(servicetype);
            var _method = servicetype.GetMethod("StartProcess");

            var rMessage = _method.Invoke(_as, new object[] {objectf});

基本上,Activator就是您所需要的。它允许您在运行时创建所需类型的对象。

答案 3 :(得分:0)

我将{object 0}更改为{dynamic 0}并且有效。