在 运行 时间将对象转换为另一种类型
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}
并且有效。
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}
并且有效。