gpt4 book ai didi

c# - 带有事件名称 lambda 表达式和自定义事件访问器的 WeakEventManager

转载 作者:太空狗 更新时间:2023-10-29 23:47:01 24 4
gpt4 key购买 nike

我一直在研究使用弱事件模式订阅事件。使用 .NET 4.5 框架,我们有一个漂亮的外观 WeakEventManager类(class)。弱订阅一个事件就这么简单

WeakEventManager<EventSource, SomeEventEventArgs>.AddHandler(source, "SomeEvent", source_SomeEvent);

不过,我不是“字符串类型”代码的忠实拥护者。我一直在尝试找到一种方法来使用要订阅的事件的字符串名称。 only way我发现获取事件的名称是在定义事件的类中使用 lambda 表达式。在我的场景中,我拥有定义事件的类,因此我可以随意更改它。我一直在努力寻找一种干净的方式来订阅和取消订阅我的事件,这是我最不喜欢的。

public event EventHandler<EventArgs> LoggingOn;
public event EventHandler<EventArgs> LoggingOn_Weak
{
add
{
var eventName = this.GetEventName(() => this.LoggingOn);
WeakEventManager<CurrentUser, EventArgs>.AddHandler(this, eventName, value);
}

remove
{
var eventName = this.GetEventName(() => this.LoggingOn);
WeakEventManager<CurrentUser, EventArgs>.RemoveHandler(this, eventName, value);
}
}

// In a base class view model in my scenario
private string GetEventName<T>(System.Linq.Expressions.Expression<Func<T>> expression)
{
return (expression.Body as System.Linq.Expressions.MemberExpression).Member.Name;
}

protected void OnLoggingOn(object sender, EventArgs e)
{
var handler = this.LoggingOn;
if (handler != null)
{
handler(sender, e);
}
}

使用 custom event accessors我能够避免像 LoggingOn_Subscribe(EventHandler) 这样笨拙的(在我看来)方法或为每个事件添加名称属性。不幸的是,它不是那么直观,因为订阅该事件的人是以经典方式这样做的,但除了名称中的“_Weak”部分表明它正在被弱订阅之外,别无他法。

至于我的问题..

1) 我以前从未使用过弱事件或自定义事件访问器。上面的代码似乎有效,但是,我只想确保它在技术上没有任何问题。我在这里做的是不是搬起石头砸自己的脚?

2) 从设计的角度来看,这是一个糟糕的想法吗?有什么我应该考虑的主要设计问题吗?有更好的选择吗?我应该接受它并使用字符串类型的事件名称从我的订阅者那里订阅吗?

想法?

最佳答案

在 .NET 4.6 中,您现在可以使用 nameof() 表达式:

WeakEventManager<IMyGrid, MyEventArgs>.AddHandler(myGrid, nameof(IMyGrid.MouseDown), OnMouseDown);

关于c# - 带有事件名称 lambda 表达式和自定义事件访问器的 WeakEventManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13088829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com