从旧版本的 MVVM Light 升级时,我也遇到过同样的事情(更改集 3bdbffb4e70a “BL0014 Misc”)。立即 Send() 停止工作。
要解决此问题,请尝试使用 .Register() 重载并将 receiveDerivedMessagesToo 设置为 true。
当为它们创建某种类型的 DynamicProxy 的 Send()ing 对象时,可能会发生此问题。例如,当您在数据上下文的任何集合下使用 Local 属性时,EntityFramework 将执行此操作。
例如 ctx.Dealers.Local 的 EntityFramework DBContext 将生成如下类型的项目列表:
System.Data.Entity.DynamicProxies.Dealer_D4CEAA0F527F5360DEB9B2B35305241B76A107C37B9DB8B368984B7DF69AEE1E
当与注册听众匹配时,Messenger.SendToTargetOrType() 将失败,因为注册类型只是“经销商”而不是经销商的代理。
为什么这过去不需要将 receiveDerivedMessagesToo 设置为 true 就可以工作,而现在却不行?
以前 MVVM Light "Messenger.cs" Messenger.SendToTargetOrType() 有这个代码:
private void SendToTargetOrType<TMessage>(TMessage message, Type messageTargetType, object token)
{
var messageType = typeof(TMessage);
这很有效,因为传递的数据的实际类型无关紧要,只是注册类型的类型。
现在代码已更改为:
private void SendToTargetOrType<TMessage>(TMessage message, Type messageTargetType, object token)
{
Type messageType = message.GetType();
现在改为使用参数的类型。这是一个问题,因为如果您的“消息”是某种类型的代理,则注册侦听器的搜索将失败。