【问题标题】:Dynamic casting and message type动态转换和消息类型
【发布时间】:2011-07-27 07:56:42
【问题描述】:

我有这个对象,我正在序列化并通过 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);
}

我已经尝试了所有不同的动态转换方法,例如使用反射,其中一些方法有效,但我真正的问题是要在信使调用中的那些 括号之间找到一些东西。

【问题讨论】:

标签: c# .net reflection dynamic


【解决方案1】:

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

完成此操作后,MethodBase.Invoke 可用于使用您的参数调用该方法。

【讨论】:

  • 感谢您的帮助。我能够完成这项工作,但这并不容易。任何想做类似的人都应该看看GetMethod for generic method
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    相关资源
    最近更新 更多