30 votes

Comment appeler un opérateur personnalisé avec Reflection

Dans mon petit projet, j'utilise System.Reflection pour produire du code exécutable. J'ai besoin d'appeler le + d'un type personnalisé. Quelqu'un sait-il comment appeler l'opérateur personnalisé d'une classe personnalisée en utilisant la réflexion C# ?

43voto

MD.Unicorn Points 8354

Le compilateur de C# convertit les opérateurs surchargés en fonctions avec nom. op_XXXX donde XXXX est l'opération. Par exemple, operator + est compilé comme op_Addition .

Voici la liste complète des opérateurs surchargeables et leurs noms de méthodes respectifs :

┌──────────────────────────┬───────────────────────┬──────────────────────────┐
│         Operator         │      Method Name      │       Description        │
├──────────────────────────┼───────────────────────┼──────────────────────────┤
│ operator +               │ op_UnaryPlus          │ Unary                    │
│ operator -               │ op_UnaryNegation      │ Unary                    │
│ operator ++              │ op_Increment          │                          │
│ operator --              │ op_Decrement          │                          │
│ operator !               │ op_LogicalNot         │                          │
│ operator +               │ op_Addition           │                          │
│ operator -               │ op_Subtraction        │                          │
│ operator *               │ op_Multiply           │                          │
│ operator /               │ op_Division           │                          │
│ operator &               │ op_BitwiseAnd         │                          │
│ operator |               │ op_BitwiseOr          │                          │
│ operator ^               │ op_ExclusiveOr        │                          │
│ operator ~               │ op_OnesComplement     │                          │
│ operator ==              │ op_Equality           │                          │
│ operator !=              │ op_Inequality         │                          │
│ operator <               │ op_LessThan           │                          │
│ operator >               │ op_GreaterThan        │                          │
│ operator <=              │ op_LessThanOrEqual    │                          │
│ operator >=              │ op_GreaterThanOrEqual │                          │
│ operator <<              │ op_LeftShift          │                          │
│ operator >>              │ op_RightShift         │                          │
│ operator %               │ op_Modulus            │                          │
│ implicit operator <type> │ op_Implicit           │ Implicit type conversion │
│ explicit operator <type> │ op_Explicit           │ Explicit type conversion │
│ operator true            │ op_True               │                          │
│ operator false           │ op_False              │                          │
└──────────────────────────┴───────────────────────┴──────────────────────────┘

Donc pour récupérer le operator+ de la méthode DateTime struct, vous devez écrire :

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

7voto

Danny Chen Points 14781
typeof(A).GetMethod("op_Addition").Invoke(null, instance1, instance2);

0voto

Talha Points 7596

Pensez à faire votre opérateur personnalisé comme property de votre Class . Et ensuite accéder au property et son value par le biais de reflection .

comme

PropertyInfo pinfo = obj.GetType().GetProperty("CustomOperator", BindingFlags.Public | BindingFlags.Instance);
string customOperator = pinfo.GetValue(obj,null) as string;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X