【问题标题】:Generic EventAggregator?通用事件聚合器?
【发布时间】:2012-03-08 09:52:36
【问题描述】:

我们想触发事件,事件名称保存在 SQL Server 中

在 SQL Server 中,您会找到 ApplicationExitRequestEvent 当我们点击菜单按钮时,我们会从 MenuItem 中获取字符串

Type t = Type.GetType(SelectedMenu.View + "," + "AssemblyName");
var obj = Activator.CreateInstance(t);

if (t != null)
{
//Working firing Event with className
EventAggregator.GetEvent<ApplicationExitRequestEvent>().Publish(null);

//Generic?
EventAggregator.GetEvent<???>().Publish(null);
}

有可能吗? 使用 PRISM 和 MVVM - WPF - .NET 4.0

【问题讨论】:

  • 请参阅this question,了解如何使用反射调用泛型方法。如果性能是一个问题,这样做可能不是最佳做法。
  • 谢谢。 MethodInfo method = EventAggregator.GetType().GetMethod("GetEvent"); MethodInfo generic = method.MakeGenericMethod(typeof(ApplicationExitRequestEvent)); generic.Invoke(this, null); 不起作用。有什么想法吗?
  • 对象不等于目标对象?!

标签: wpf generics mvvm prism eventaggregator


【解决方案1】:

如果您查看 EventAggregator 类,您会发现它只不过是一个容器 Dictionary&lt;Type, EventBase&gt;GetEvent 方法。就是这样,所有实际工作都在EventBase 中完成。为了实现您想要的,您可以修改类(或复制并修改它),并添加一个方法 GetEvent( string typeString ) 将 typeString 转换为实际的 Type (与您的代码示例中的方式相同) 并使用它从字典中获取事件。

【讨论】:

【解决方案2】:

知道了,现在工作正常! 拉皮条棱镜库,按类型获取事件:-)

    /// <summary>
    /// Gets the single instance of the event managed by this EventAggregator. 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1004:GenericMethodsShouldProvideTypeParameter")]
    public CompositePresentationEvent<object> GetEvent(Type type)
    {
        EventBase existingEvent = null;
        events.TryGetValue(type, out existingEvent);

        if(existingEvent != null)
            return (CompositePresentationEvent<object>)existingEvent;

        return null;
    }

谢谢你们!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    相关资源
    最近更新 更多