Cuando escribe una llamada que invoca un método que no es accesible (usando las reglas de acceso estándar de C#), entonces no se llamará al método inaccesible y el tiempo de ejecución llamará al TryInvokeMember
(donde puede manejar la llamada de alguna otra manera). Este es un ejemplo, para que pueda probarlo:
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);
}
}
Ahora, podemos crear una instancia del objeto y tratar de llamar a algunos de sus métodos:
dynamic d = new Test();
d.Foo(); // this will call 'Foo' directly (without calling 'TryInvokeMember')
d.Bar(); // this will call 'TryInvokeMember' and then throw exception
lo tanto, si se llama a la base
implementación de TryInvokeMember
, la carpeta dinámica C# fallará al llamar a un método inaccesible, pero puede definir su propio manejo de la caja en TryInvokeMember
(estableciendo result
en algún valor y devolviendo true
).
No es un problema, pero lo primero que haría en este escenario es probarlo y ver :) – spronkey