2012-06-20 668 views
18

En mi pequeño proyecto estoy usando System.Reflection clases para producir código ejecutable. Necesito llamar al operador + de un tipo personalizado. ¿Alguien sabe cómo puedo llamar al operador personalizado de la clase personalizada usando la reflexión de C#?Cómo llamar al operador personalizado con Reflection

Respuesta

22

C# compilador convierte sobrecargado operador para funciones con nombre op_XXXX donde XXXX es la operación:

operator== ->op_Equality
operator!= ->op_Inequality
operator+ ->op_Addition
operator- ->op_Subtraction
operator< ->op_LessThan
operator> ->op_GreaterThan
operator<= ->op_LessThanOrEqual
operator>= ->op_GreaterThanOrEqual
y así sucesivamente.

Así que para recuperar el método de la DateTime estructura operator+, tiene que escribir:

MethodInfo mi = typeof(DateTime).GetMethod("op_Addition", 
    BindingFlags.Static | BindingFlags.Public); 
+1

Simplemente curioso :) ¿Qué pasa si tengo un método estático 'op_Addition' con la misma firma? –

+1

@ ŞafakGür A continuación, obtendrá un error del compilador que dice "Tipo '' ya define un miembro llamado 'op_Addition' con los mismos tipos de parámetros". Debido a que el método del operador definido se renombró exactamente al nombre antes mencionado, no puede tener ambos en la misma clase. –

+0

¿Y cuál sería la regla de denominación para los operadores de casting? – Grx70

1

Considere hacer su operador personalizado como property de su Class. Y luego acceda al property y su value a través de reflection.

como

PropertyInfo pinfo = obj.GetType().GetProperty("CustomOperator", BindingFlags.Public | BindingFlags.Instance); 
string customOperator = pinfo.GetValue(obj,null) as string; 
6
typeof(A).GetMethod("op_Addition").Invoke(null, instance1, instance2); 
Cuestiones relacionadas