使用DynamicMethod.TryInvokeMember()相比使用字典作为参数的优势是什么?

3
除了语法之外,在使用C# 4.0时有哪些优点?
DynamicObject.TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) 

与只调用此签名的非动态方法相比:

public object MethodParser(string methodName, Dictionary<string, object> arguments) 

methodName是“方法”的名称,arguments是参数名称和参数值的字典(MethodParser只是一个任意名称)。

换句话说,调用

foo.NonExistentMethod(arg1:"a1", arg2:3.14m)

结束

foo.MethodParser("NonExistentMethod", new Dictionary<string, object>(){{"arg1", "a1"}, {"arg2": 3.14m}})
3个回答

4
您可以在DynamicObject之外轻松地进行性能调优而无需进行重构。例如,如果在分析时发现该对象上的特定动态方法调用是一个热点,您可以将该特定方法静态添加到DynamicObject中,这样不仅可以获得非字符串查找的动态调用(在第一次调用后),而且还可以以清晰的方式单独优化特定实现,与其余动态代码分开。
或者,您可以为整个动态代码编写更优化的IDynamicMetaObjectProvider,而不是使用DynamicObject(就像Microsoft为ExpandoObject所做的那样),然后它就不需要依赖于每个后续调用的字符串查找,就像MethodParser和TryInvokeMember一样。
如果成员名称并不是真正重要的话(很难从示例中判断),您可以只声明返回带有DynamicObject的动态属性getter,使用DynamicObject.TryInvoke,然后您将获得名称部分的一些自动完成,并且仍然可以具有动态参数名称。
但显然,主要优点是我们应该忽略的,那就是MethodParser可读性较差。

4
动态方法的优点在于它们可以与动态语言(尤其是由DLR、IronPython和IronRuby提供的语言)相互操作。您提出的第二种方法没有提供任何互操作性。
另一个巨大的优势是可读性。代码的审查和维护者可以更轻松地阅读和理解动态方法调用,而不是基于字典的调用。

3
那是一个很大的问题。以下是我对此问题的一些想法。
优点:
1) VS可以为先前使用的动态成员提供智能感知,这是更好的IDE体验。
2) 它与其他代码更加一致,使其更易于阅读和理解。
3) 它可以表现得更好,因为它是在Reflection之上的一层,因此可以缓存委托,从而仅为成员调用一次Reflection
4) 它与诸如COM等技术互操作,这在使用Reflection时并非如此,并避免了在调用之间显式转换类型的需要。
5) 它比Reflection具有更松散的耦合性。可以重新映射内部成员,而不影响消费它的代码。
6) 可以虚拟化一个实例。被调用的成员实际上不需要存在。实现完全可扩展,允许创建代理/外观,从而将实现隐藏在调用者之外。
缺点:
1) 在不必要地丢失类型检查的情况下容易被滥用。只需键入关键字即可,而不是理解和编写围绕Reflection的代码。
2) 使用漂亮的语法无法防止魔术字符串。
我相信还有更多,只是想分享一些尚未提出的观点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接