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

Cast object to another type at run time

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

我需要调用的方法接受另一种类型,我需要将对象转换为该类型,但是,该类型仅在 运行 时已知,所以我可以 convert/cast 反对另一种仅在 运行 时间才知道的类型?我只能更改方法 A.

谢谢。

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

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

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

这是我在需要不同处理的几条类似消息时使用的代码。 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 就是您所需要的。它允许您在运行时创建所需类型的对象。

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