17

这是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 if 用于对象或委托,而 TryInvokeMember 用于方法,但是为什么要使用两个方法呢?一个很好的例子将不胜感激。

4

2 回答 2

16

文档不是很清楚,但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 表示尝试调用的方法未实现。

如果有一个非空实现,不同之处在于TryInvokeMember它将检查binder.Name属性以确定将调用哪个方法,而不会为TryInvoke.

于 2012-10-28T19:04:25.180 回答
1

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

于 2013-03-12T21:35:02.837 回答