.Net Standard 1.4中的动态调度

时间:2017-09-19 22:21:53

标签: c# .net-core .net-standard

我在.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)之间的动态调度是否已更改?我可以不再使用这种方法吗?

1 个答案:

答案 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