2011-03-31 104 views
2

我有這個對象,我序列化並通過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://stackoverflow.com/questions/232535/how-to-use-reflection-to-call-generic-method) – nawfal 2014-01-18 05:47:27

回答

1

如果使用反射產生用於Send方法的MethodInfo,可以使用MethodInfo.MakeGenericMethod創建具有由genType定義的特定類型的方法。

一旦你這樣做了,MethodBase.Invoke可以用來調用你的參數的方法。

+0

謝謝您的幫助。我能夠完成這項工作,但這並不容易。任何其他想做類似事情的人都應該看看[GetMethod for generic method](http://stackoverflow.com/questions/4035719/getmethod-for-generic-method) – user686661 2011-04-01 21:31:31

0

你也可以在.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) 
}