动态铸造和消息类型

问题描述:

我有这个对象,我序列化并通过TCP/IP发送到服务器,我需要反序列化它并在正确类型的消息中将其关闭。我正在使用.net 4.动态铸造和消息类型

问题是对象可能有几种不同类型,并且使者需要知道它发送的类型。我想要做的是发送一个字符串或Type对象,它将指定主对象的类型。现在,我这样做,但它仅适用于一个类型:

public void generic_Obj(Object obj) 
{ 
    //Entity is a class that I define elsewhere 
    //I'm using the Galasoft MVVM Light messenger 
    Messenger.Default.Send<Entity>((Entity)obj, "token"); 
} 

我想要做这样的事情使用反射:

public void gen_Obj(Object obj, Type genType, string token) 
{ 
    //this doesn't work btw 
    Messenger.Default.Send<genType>((genType)obj, token); 
} 

我已经尝试了所有不同的方法动态投射等使用反射,其中一些工作,但我真正的问题是找到一些东西放在这些信使呼叫中的括号。

+0

可能重复[如何使用反射来调用泛型方法?(http://*.com/questions/232535/how-to-use-reflection-to-call-generic-method) – nawfal 2014-01-18 05:47:27

如果使用反射产生用于Send方法的MethodInfo,可以使用MethodInfo.MakeGenericMethod创建具有由genType定义的特定类型的方法。

一旦你这样做了,MethodBase.Invoke可以用来调用你的参数的方法。

+0

谢谢您的帮助。我能够完成这项工作,但这并不容易。任何其他想做类似事情的人都应该看看[GetMethod for generic method](http://*.com/questions/4035719/getmethod-for-generic-method) – user686661 2011-04-01 21:31:31

你也可以在.net 4中使用dlr而不是反射来做到这一点。开源框架Impromptu-interface有一个辅助方法,它使easy

public void gen_Obj(Object obj, Type genType, string token) 
{ 
    Impromptu.InvokeMemberAction(Messenger.Default,"Send".WithGenericArgs(genType),obj,token) 
}