2012-04-02 16 views
9

È possibile utilizzare Type.InvokeMember per richiamare un metodo tramite reflection e sembra piuttosto robusto, ad esempio per quanto riguarda i parametri dell'array param. Per qualche ragione, tuttavia, non tratta i parametri opzionali.Richiamare un metodo con parametri facoltativi tramite riflessione

Esiste un approccio integrato migliore per richiamare un metodo (magari utilizzando il DLR) che tiene conto dei parametri facoltativi?

+0

È possibile chiamare type.GetMethod (...) per ottenere un'istanza MethodInfo. Quindi puoi chiamare methodInfo.Invoke(), per i parametri facoltativi, puoi passare Type.Missing –

+0

Ma questo mi impone di andare allo sforzo di iterare su tutte le possibili istanze del metodo e di capire se i miei parametri sono appropriati dato l'opzionale parametri. Fondamentalmente facendo manualmente il binding che è quello che sto facendo al momento. Sembra che Type.InvokeMember vada al 90% del modo e poi fallisce. Guardando il duplicato sembra che sono bloccato a farlo manualmente per ora. –

risposta

5

Nell'esempio seguente, viene chiamata una funzione con due parametri che non restituiscono nulla. Il secondo parametro è facoltativo.

MethodInfo mi = default(MethodInfo); 

// Loading the assembly 
Assembly reflectionAssemby = Assembly.LoadFile(@"C:\RelectionDLL.dll"); 

// Get type of class from loaded assembly 
Type reflectionClassType = reflectionAssemby.GetType("ReflectionDLL.ReflectionClass"); 

// Create instance of the class 
object objReflection = Activator.CreateInstance(reflectionClassType); 

mi = reflectionClassType.GetMethod("pub_Inst_NoReturn_Function"); 
mi.Invoke(objReflection, new object[] { value1, Type.Missing }); 
+1

Grazie per la risposta. Il problema con questo è che avrei ancora bisogno di scavare nei metadati per determinare che il parametro opzionale esiste in modo che io possa passare Type.Missing. Speravo in una soluzione che replicasse sostanzialmente le capacità di associazione del compilatore C# in fase di runtime. –

+0

@JamesGaunt Vecchio post, ma alla fine hai trovato un modo per aggirare questo? –

+0

Wow sì molto vecchio ... Ho trovato un modo ... ma solo usando il compilatore di Roslyn per compilare il C# direttamente contro le dipendenze richieste in fase di esecuzione. Quindi non risolvendo veramente lo stesso problema. Ma ci sono probabilmente dei modi per usare le nuove funzionalità del compilatore per compilare del codice di esempio e quindi ispezionare l'AST per vedere anche cosa ha finito per essere vincolante. –

Problemi correlati