C# 4.0 - Делает вызов защищенного метода для вызова динамического объекта TryInvokeMember ()?

В C# 4.0 существует новый DynamicObject.

Это предоставляет "волшебный метод" TryInvokeMember (), который называют при попытке назвать метод, который не существует.

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

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

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

5
задан Jonathan Leffler 26 May 2015 в 05:05
поделиться

1 ответ

Когда вы пишете вызов, который будет вызывать метод, который недоступен (с использованием стандартных правил доступа 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 реализацию of TryInvokeMember , динамическое связывание C # завершится ошибкой при вызове недоступного метода, но вы можете определить свою собственную обработку случая в TryInvokeMember (установив результат до некоторого значения и возвращая истину ).

6
ответ дан 14 December 2019 в 13:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: