C # 4.0 - вызывает ли защищенный метод динамического объекта функцию TryInvokeMember ()? - PullRequest
5 голосов
/ 05 марта 2010

В C # 4.0 появился новый DynamicObject.

Он предоставляет "магический метод" TryInvokeMember (), который вызывается при попытке вызвать метод, который не существует.

http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.tryinvokemember%28VS.100%29.aspx

Что я хотел бы знать, так это то, что TryInvokeMember () вызывается при попытке вызвать защищенный метод извне определяющего класса.

Я сравниваю поведение с PHP, который в этой ситуации вызывает его эквивалентный "магический метод" __call ().

1 Ответ

6 голосов
/ 05 марта 2010

Когда вы пишете вызов, который будет вызывать метод, который недоступен (с использованием стандартных правил доступа C #), тогда недоступный метод не будет вызываться, и среда выполнения вызовет TryInvokeMember (где вы можете обработать позвони другим способом). Вот пример, так что вы можете попробовать это:

class Test : DynamicObject {
  public void Foo() {
    Console.WriteLine("Foo called");
  }
  protected void Bar() {
    Console.WriteLine("Bar called");
  }

  public override bool TryInvokeMember
      (InvokeMemberBinder binder, object[] args, out object result) {
    Console.WriteLine("Calling: " + binder.Name);
    return base.TryInvokeMember(binder, args, out result);
  }
}

Теперь мы можем создать экземпляр объекта и попробовать вызвать некоторые из его методов:

dynamic d = new Test();
d.Foo(); // this will call 'Foo' directly (without calling 'TryInvokeMember')
d.Bar(); // this will call 'TryInvokeMember' and then throw exception

Таким образом, если вы вызываете base реализацию TryInvokeMember, динамическое связывание C # завершится неудачно при вызове недоступного метода, но вы можете определить собственную обработку обращения в TryInvokeMember (установив result к некоторому значению и возвращая true).

...