使用
的C#4.0(除了语法之外)有什么优点DynamicObject.TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
仅使用此签名调用非动态方法:
public object MethodParser(string methodName, Dictionary<string, object> arguments)
其中methodName是“method”的名称参数是参数名称和参数值的字典(MethodParser只是一个任意名称)
换句话说,拨打
foo.NonExistentMethod(arg1:"a1", arg2:3.14m)
在
foo.MethodParser("NonExistentMethod", new Dictionary<string, object>(){{"arg1", "a1"}, {"arg2": 3.14m}})
答案 0 :(得分:4)
您可以更轻松地进行调整,而无需在DynamicObject外部进行重构。例如,如果在分析时发现对该对象的特定动态方法调用是热点,则只需在DynamicObject上静态添加该特定方法,不仅可以获得非字符串查找动态调用(在第一个之后)调用),但您可以以干净的方式优化您的特定实现,与其他动态代码分开。
或者您可以为整个动态代码编写更优化的IDynamicMetaObjectProvider,而不是使用DynamicObject(就像Microsoft为ExpandoObject所做的那样),然后它不需要依赖于MethodParser
之后的每个后续调用的字符串查找和TryInvokeMember
会。
如果成员名称不是很重要,那么很难从示例中看出,您可以使用DynamicObject.TryInvoke
静态声明使用DynamicObject返回动态的属性获取器,然后您将获得名称的一些自动完成功能部分,仍然可以有动态参数名称。
但显然主要优势是,我们应该打折的是,MethodParser
的可读性要低得多。
答案 1 :(得分:4)
动态方法的优点是它们可以提供与动态语言的互操作性,特别是DLR,IronPython和IronRuby提供的语言。您提出的第二种方法不提供任何互操作性。
可读性的另一个巨大优势。检查和维护代码的人可以比基于字典的调用更容易地阅读和理解动态方法调用。
答案 2 :(得分:3)
这是个大问题。以下是我对这个问题的一些看法。
<强>优点强>
1)VS可以为以前使用的动态成员提供智能,这是一种更好的IDE体验。
2)它与其他代码更加一致,使其更易于阅读和理解。
3)它可以更好地执行,因为它是Reflection
之上的一个层,因此可以缓存委托,从而只为成员调用Reflection
一次。
4)它可以与COM等技术互操作,使用Reflection
时不可行,并且无需在调用之间显式转换类型。
5)它提供比Reflection
更松散的耦合。可以重新映射内部成员,而不会影响使用它的代码。
6)可以虚拟化实例。被呼叫的成员实际上并不需要存在。该实现是完全可扩展的,允许创建代理/外观,隐藏调用者的实现。
<强>缺点强>
1)在不必要地丢失类型检查的情况下容易滥用。这就像键入关键字vs理解和编写Reflection
周围的代码一样简单。
2)使用漂亮的语法,不可能防止魔法字符串。
我确信还有更多只想分享一些尚未提出的观点。