版权声明:转载请注明出处 https://blog.csdn.net/lcpskk/article/details/81582709
工作中一个项目用到微软的Microsoft.Practices.Prism.PubSubEvents.dll里的发布订阅工具类,实现viewmodel之间的通信,奈何项目升级的时候升级工具不支持这么长名字的dll,我们也知道dll文件的名字和dll程序集名是强关联的,文件名不能随意改变,否则编译可以通过,运行的时候是按程序集名+.dll后缀去寻找dll路径的,必然会导致无法找到引用文件错误。那么没办法只好自己实现这个工具类了,简单版工具类如下:
public class LDEventAggregator
{
public delegate void MsgAction(object msgTopic);
private Dictionary<string, List<MsgAction>> actionDic = new Dictionary<string, List<MsgAction>>();
public void Publish(object msgTopic)
{
if (actionDic.ContainsKey(msgTopic.GetType().Name))
{
foreach (var doAction in actionDic[msgTopic.GetType().Name])
{
if (doAction != null)
{
doAction(msgTopic);
}
}
}
}
public void Subscribe<T>(MsgAction aAction)
{
string typeName = typeof(T).Name;
if (string.IsNullOrEmpty(typeName))
return;
if (!actionDic.ContainsKey(typeName))
{
actionDic.Add(typeName, new List<MsgAction>() { aAction});
}
else
{
actionDic[typeName].Add(aAction);
}
}
}
使用的时候,保证发布者和订阅者用同一个工具类去发布订阅就好了:
订阅者:this.EventAggregator.Subscribe<MyCustomEvent>(this.Dosomething);
发布者:this.EventAggregator.Publish(new MyCustomEvent());