Разница между TryInvokeMember и TryInvoke

Это часть класса 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 для методов, но почему два метода для этого? Хороший пример будет оценен.

Ответы

Ответ 1

Документация не совсем понятна, но примеры для TryInvoke и TryInvokeMember показывают разницу. 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.

Ответ 2

также

еЫп (число);//вызывается объект, а метод TryInvoke называется