我在.Net中使用动态调度来处理过去的事件处理。你可以看到这种方法,例如this article from 2009
简而言之,您有一个基本事件类型
container.addValueChangeListener(e -> {
Item item = container.getItem(6);
if(!e.getProperty().equals(item.getItemProperty("Person3")))
item.getItemProperty("Person3").setValue(54 + "");
if(!e.getProperty().equals(item.getItemProperty("Person4")))
item.getItemProperty("Person4").setValue(65 + "");
});
和特定事件
public class Event {}
其他一些类可以使用public class QuestionAsked : Event {}
public class QuestionAnswered : Event {}
的可枚举来应用它们
Event
此类不需要为每种类型使用// snip
public void Apply(IEnumerable<Event> events) => events.ToList().ForEach(Apply);
public void Apply(Event ev) => ((dynamic) this).Apply((dynamic) ev);
private void Apply(QuestionAnswered qa) {
//something
}
// end snip
方法。它只是忽略了它不关心的任何事件。
我刚尝试使用.NetStandard 1.4做同样的事情,如果我尝试应用没有私有Apply
方法的类型,我会得到Apply
.Net 4.5.x和.Net(Core | Standard)之间的动态调度是否已更改?我可以不再使用这种方法吗?
答案 0 :(得分:2)
嗯,公开学习的一个缺点是,有时候你会发现自己错了:)
我在.Net 4.5.x中尝试了相同的代码,它也失败了 - 我显然把过去使用的安全内容与这个不安全的代码混为一谈。
这只是if there is a method called Apply that takes this type as an argument then invoke it
的简洁表达所以......
public void Apply(IEnumerable<Event> events) => events.ToList().ForEach(Apply);
public void Apply(Event ev)
{
GetType()
.GetRuntimeMethods()
.Where(mi => mi.IsPrivate)
.Where(mi => mi.Name == "Apply")
.Where(mi => mi.GetParameters().Length == 1)
.SingleOrDefault(mi => mi.GetParameters().SingleOrDefault()?.ParameterType == ev.GetType())
?.Invoke(this, new[] {ev});
}
我的测试通过了该代码。即应用具有方法的事件和不被忽略的事件。
显然,在真正的应用程序中,你只需要找到一次方法,然后在每次调用时检查它们,但我会把它作为读者的练习; P