Quando si scrive una chiamata che invoca un metodo non accessibile (utilizzando le regole di accesso C# standard), il metodo inaccessibile non verrà chiamato e il runtime chiamerà lo TryInvokeMember
(dove è possibile gestire la chiamata in qualche altro modo). Ecco un esempio, in modo che si può provare:
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);
}
}
Ora, siamo in grado di creare un'istanza dell'oggetto e provare a chiamare alcuni dei suoi metodi:
dynamic d = new Test();
d.Foo(); // this will call 'Foo' directly (without calling 'TryInvokeMember')
d.Bar(); // this will call 'TryInvokeMember' and then throw exception
Quindi, se si chiama il base
implementazione di TryInvokeMember
, il raccoglitore dinamico C# fallirà quando si chiama un metodo inaccessibile, ma è possibile definire la propria gestione del caso in TryInvokeMember
(impostando il valore result
su un valore e restituendo true
).
fonte
2010-03-04 23:08:27
Non essere una puntura, ma la prima cosa che farei in questo scenario è provare e vedere :) – spronkey