2011-12-15 16 views
8

Come posso verificare se un determinato tipo implementa un determinato operatore?Come verificare se un tipo sovraccarica/supporta un determinato operatore?

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

A seguito di due controlli dovrebbero tornare true:

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

risposta

2

Ci è un modo rapido e sporco per scoprirlo, e funziona sia per i tipi built-in che per i tipi personalizzati. Il suo principale svantaggio è che si basa su eccezioni in un flusso normale, ma ottiene il compito.

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

Già considerato. Potrebbe essere ancora la soluzione migliore, poiché continuerà a funzionare anche quando ad es. vengono aggiunti nuovi tipi predefiniti purché siano supportati gli Expression Trees. Non so quanto più lento del riflesso sarebbe, ma un metodo come "HasOperator" non dovrebbe essere chiamato spesso comunque. –

+0

+ 1, come, il trucco buono –

+2

sembra "programmazione guidata da eccezioni", ma devo ammettere che questo è il modo migliore per creare un metodo breve e pulito per risolvere il problema, inclusi tutti gli operatori, non solo l'aggiunta. –

6

si dovrebbe verificare se la classe avere metodo con op_Addition nome È possibile trovare sovraccaricato i nomi dei metodi here,
Spero che questo aiuti

+0

Bel collegamento! Sai se riesci a ottenere lo stesso trucco sui built-in? – dasblinkenlight

+0

@dasblinkenlight: una volta compilato tutto, controllerò se è possibile. Altrimenti dovrò aggiungere una logica aggiuntiva per controllare i built-in. –

+0

Onestamente non conosco i built-in, lascia un commento dopo il controllo per favore –

3

un metodo di estensione chiamato HasAdditionOp simili:

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

noti che IsSpecialName impedisce un normale metodo con il nome "op_Addition";

+0

' bool' non supporta l'aggiunta. Ma +1 per menzionare 'IsSpecialname'. –

+0

@StevenJeuris: Ya, ho trovato il problema 'bool' dopo aver postato questa risposta. E 'string' non impianta l'operatore' -'. Quindi è davvero difficile dire a tutti i tipi primitivi in ​​questo modo. –

Problemi correlati