Qualcuno sa di un modo per intercettare le chiamate al metodo dynamic
(in particolare quelle che stanno per aumentare RuntimeBinderException
s) con un RealProxy
? Speravo di cogliere l'eccezione e di implementare il "metodo mancante", ma sembra che venga gettato prima che l'intercettatore riesca a dare un'occhiata.Difficoltà mancate nel metodo in C# 4.0: dinamico vs RealProxy
Il mio test sembra proprio:
dynamic hello = MethodMissingInterceptor<DynamicObject>.Create();
Assert.AreEqual("World", hello.World());
Dove World
non è effettivamente attuate sulla DynamicObject
. L'intercettore è piuttosto semplice - Speravo di controllare IMethodReturnMessage.Exception
per RuntimeBinderException
e in avanti a qualcosa di simile:
public IMessage MethodMissing(IMethodCallMessage call)
{
return new ReturnMessage(call.MethodBase.Name, new object[0], 0, call.LogicalCallContext, call);
}
Purtroppo, tutto quello che vedo nel mio intercettore sono alcune chiamate a GetType
, e non il World
metodo inesistente .
In caso contrario, qualcuno sa se esiste ancora una versione DynamicProxy
che gira felicemente su .NET 4.0 che potrebbe aver risolto il problema?
Grazie per l'eccellente spiegazione, Chris: ho appena iniziato a leggere la tua serie di post "dinamici" C# sul tuo blog. :) Per i miei scopi, la tua prima soluzione sembra funzionare correttamente. Voglio davvero fare queste chiamate per gli oggetti in stile builder e per una maggiore fluidità nel test delle API, non ho bisogno di catturarle su oggetti arbitrari. – Thom
@Chris - nota anche la domanda "just in case" sopra; in realtà, mi piacerebbe sapere che ;-p –
C'è un modo per interrogare l'oggetto dinamico solo per la presenza di un membro senza effettivamente chiamarlo? –