2012-06-20 8 views
18

Nel mio piccolo progetto sto usando le classi System.Reflection per produrre codice eseguibile. Devo chiamare l'operatore + di un tipo personalizzato. Qualcuno sa come posso chiamare l'operatore personalizzato della classe personalizzata usando la riflessione C#?Come chiamare un operatore personalizzato con Reflection

risposta

22

C# compilatore converte sovraccarico all'operatore di funzioni con nome op_XXXX dove XXXX è l'operazione:

operator== ->op_Equality
operator!= ->op_Inequality
operator+ ->op_Addition
operator- ->op_Subtraction
operator< ->op_LessThan
operator> ->op_GreaterThan
operator<= ->op_LessThanOrEqual
operator>= ->op_GreaterThanOrEqual
e così via.

Quindi, per recuperare il metodo del DateTime struct operator+, è necessario scrivere:

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

Solo curioso :) Che cosa succede se ho un metodo statico 'op_Addition' con la stessa firma? –

+1

@ ŞafakGür Quindi riceverai un errore del compilatore che dice "Tipo '' definisce già un membro chiamato 'op_Addition' con gli stessi tipi di parametri". Poiché il metodo operatore definito viene rinominato esattamente con il nome sopracitato, non è possibile avere entrambi nella stessa classe. –

+0

E quale sarebbe la regola di denominazione per gli operatori di casting? – Grx70

1

Considera di rendere il tuo operatore personalizzato come property del tuo Class. E quindi accedere allo property e al suo value tramite reflection.

come

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);