2011-12-15 12 views
8

¿Cómo puedo verificar si un determinado tipo implementa un determinado operador?¿Cómo verificar si un tipo sobrecarga/admite un determinado operador?

struct CustomOperatorsClass 
{ 
    public int Value { get; private set; } 


    public CustomOperatorsClass(int value) 
     : this() 
    { 
     Value = value; 
    } 

    static public CustomOperatorsClass operator +(
     CustomOperatorsClass a, CustomOperatorsClass b) 
    { 
     return new CustomOperatorsClass(a.Value + b.Value); 
    } 
} 

Después de dos cheques deben volver true:

typeof(CustomOperatorsClass).HasOperator(Operator.Addition) 
typeof(int).HasOperator(Operator.Addition) 

Respuesta

2

Hay es una forma rápida y sucia de averiguarlo, y funciona tanto para tipos incorporados como personalizados. Su mayor inconveniente es que depende de excepciones en un flujo normal, pero hace el trabajo bien.

static bool HasAdd<T>() { 
    var c = Expression.Constant(default(T), typeof(T)); 
    try { 
     Expression.Add(c, c); // Throws an exception if + is not defined 
     return true; 
    } catch { 
     return false; 
    } 
} 
+1

Ya lo consideré. En realidad, esta podría ser la mejor solución, ya que continuará funcionando incluso cuando, por ejemplo, Se agregan nuevos tipos incorporados siempre que se admitan árboles de expresiones. No sé cuánto más lento que el reflejo sería, pero un método como 'HasOperator' se supone que no se llama a menudo de todos modos. –

+0

+ 1, como, buen truco –

+2

parece "programación impulsada por excepciones", pero tengo que admitir que esta es la mejor manera de hacer un método breve y limpio para resolver el problema, incluidos todos los operadores, no solo la adición. –

6

usted debe comprobar si la clase tiene método con op_Addition nombre Usted puede encontrar sobrecargado nombres de los métodos here,
Esperanza esto ayuda

+0

¡Bonito enlace! ¿Sabes si puedes utilizar el mismo truco para los complementos? – dasblinkenlight

+0

@dasblinkenlight: Una vez que todo se compila, comprobaré si eso es posible. De lo contrario, tendré que agregar lógica adicional para verificar los built-ins. –

+0

Honestamente, no sé sobre complementos integrados, deje comentarios después de comprobar –

3

un método de extensión llamado HasAdditionOp así:

pubilc static bool HasAdditionOp(this Type t) 
{ 
    var op_add = t.GetMethod("op_Addition"); 
    return op_add != null && op_add.IsSpecialName; 
} 

Tenga en cuenta que IsSpecialName impide un método normal con el nombre de "op_Addition";

+0

' bool' no admite la adición. Pero +1, no obstante, por mencionar 'IsSpecialname'. –

+0

@StevenJeuris: Ya, encontré el problema 'bool' después de publicar esta respuesta. Y 'string' no implica el operador' -'. Entonces es realmente difícil decir todos los tipos primitivos de esta manera. –

Cuestiones relacionadas