Quando voglio chiamare dinamicamente un metodo staticamente definito ("staticamente" nel senso di "determinato in fase di compilazione", non nel senso di "membro di livello di classe") su qualsiasi oggetto in C#, posso usare riflessione per ottenere un manico a tale metodo ed invocano:Come posso chiamare dinamicamente un metodo su un oggetto dinamico?
typeof(Foo).GetMethod("Bar").Invoke(foo, new object[] { /* params */ });
Tuttavia, oggetti dinamizzare ereditando da DynamicObject
rispondere a (undefined) metodo di richiamo di istanze utilizzando TryInvokeMember
, ei metodi dinamici classe risponde non sono esposti attraverso la riflessione, per ovvi motivi. Ciò significa che non riesco a ottenere un handle di metodo per un metodo a cui dovrebbe essere risposto da TryInvokeMember
.
Così, ironicamente, mi sembra che non si può chiamare in modo dinamico un metodo dinamico su un oggetto dynamic
stessa facilità con cui è possibile chiamare un metodo definito su un oggetto non dynamic
.
Ho considerato di chiamare direttamente TryInvokeMember
, ma il primo argomento deve essere un'istanza di InvokeMemberBinder
, una classe astratta. Sento che se devo implementare una classe per chiamare un metodo dinamico su un oggetto dinamico, devo fare qualcosa di sbagliato.
Come posso chiamare un metodo su un oggetto dynamic
con il suo nome, sapendo che la classe di destinazione non non applicarla e che dovrebbe essere risposto a utilizzare TryInvokeMember
?
Suoni divertenti. Aspetterò di vedere se qualcuno ha effettivamente una soluzione supportata dal momento che probabilmente non sarà più in giro quando smetterà di funzionare. – zneak
D'altra parte, dato che è quello che fa già il compilatore, è improbabile che smetta di funzionare, dato che ciò ucciderebbe qualsiasi applicazione usando 'dynamic' costruito oggi. – zneak
@zneak Giusto, penserei che sia una scommessa abbastanza sicura. È semplicemente sorprendente che abbiano fatto di tutto per assicurarsi che i tipi siano nascosti. – Trillian