Когда вы пишете вызов, который будет вызывать метод, который недоступен (с использованием стандартных правил доступа 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
).