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