2012-04-02 18 views
9

Puedo usar Type.InvokeMember para invocar un método por reflexión, y parece bastante robusto, por ejemplo, param array parámetros. Por alguna razón, sin embargo, no se trata de parámetros opcionales.Invocar un método con parámetros opcionales a través de la reflexión

¿Existe algún enfoque integrado mejor para invocar un método (quizás usando el DLR) que tenga en cuenta los parámetros opcionales?

+0

Puede llamar a type.GetMethod (...) para obtener una instancia de MethodInfo. Luego puede llamar a methodInfo.Invoke(), para los parámetros opcionales, puede pasar Type.Missing –

+0

. Pero esto requiere que haga un esfuerzo para iterar sobre todas las instancias posibles del método y determine si mis parámetros son apropiados dada la opción parámetros. Básicamente haciendo el enlace manualmente, que es lo que estoy haciendo en este momento. Simplemente parece que Type.InvokeMember va un 90% del camino y luego falla. Al mirar el duplicado, parece que estoy estancado al hacerlo manualmente por el momento. –

Respuesta

5

En el siguiente ejemplo, llamamos a una función con dos parámetros que no devuelven nada. El segundo param es opcional.

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

Gracias por la respuesta. El problema con esto es que todavía necesitaría profundizar en los metadatos para determinar que el parámetro opcional existe para poder pasar Type.Missing. Esperaba una solución que básicamente replicara las capacidades de enlace del compilador de C# en el tiempo de ejecución. –

+0

@JamesGaunt Publicación anterior, pero ¿finalmente encontró una forma de evitar esto? –

+0

Wow, sí, muy viejo ... Encontré una forma de encontrarlo ... pero solo al usar el compilador de Roslyn para compilar el C# directamente contra las dependencias requeridas en el tiempo de ejecución. Entonces, realmente no estoy resolviendo el mismo problema. Pero probablemente haya formas de usar las nuevas características del compilador para compilar un código de muestra y luego inspeccionar el AST para ver qué terminó vinculando también. –

Cuestiones relacionadas