TryInvokeMember和TryInvoke之间的区别

时间:2012-10-28 18:30:36

标签: c# c#-4.0 dynamic tryinvokemember

这是DynamicObject类的一部分:

public class DynamicObject : IDynamicMetaObjectProvider
{ 
    ...
    public virtual bool TryInvoke(InvokeBinder binder, object[] args, out object result)
    {
      result = (object) null;
      return false;
    }
    ...
    public virtual bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
    {
      result = (object) null;
      return false;
    }
}

来自MSDN:
TryInvoke:为调用对象的操作提供实现 TryInvokeMember:为调用成员的操作提供实现

我想知道这两种方法之间的真正的差异,因为它们具有几乎相同的语法和实现。我已经知道TryInvoke如果用于对象或委托,而TryInvokeMember用于方法,但为什么有两种方法呢?一个很好的例子将不胜感激。

2 个答案:

答案 0 :(得分:15)

文档不是很清楚,但TryInvokeTryInvokeMember的示例显示了不同之处。调用对象时调用TryInvoke(将其视为委托),并在对象上调用方法时使用TryInvokeMember

以下示例源自MSDN示例:

dynamic number;
....
// Invoking an object. 
// The TryInvoke method is called.
number(2, "Two");

// Calling a method
// The TryInvokeMember method is called.
number.Clear();

您展示的实现是相同的,因为它们都是空实现。返回false意味着未实现尝试调用的方法。

如果存在非null实现,则差异是TryInvokeMember将检查binder.Name属性以确定将调用哪个方法,而不会为TryInvoke设置该方法

答案 1 :(得分:1)

Console.WriteLine(数); //将调用一个对象,并调用TryInvoke方法