2016-11-04 5 views
0

En C#, est-il généralement une mauvaise pratique d'utiliser un argument générique pour modifier le comportement d'une méthode générique?CLR méthode générique branchement basé sur le type de l'argument générique

Dans l'exemple:

class Foo { } 
class Bar { } 

void GenericMethod<T>() 
{ 
    if (typeof(T) == typeof(Foo)) 
    { 
     Console.WriteLine("execute action for Foo"); 
    } 

    if (typeof(T) == typeof(Bar)) 
    { 
     Console.WriteLine("execute action for Bar"); 
    } 
} 

void NonGenericMethod(Type type) 
{ 
    if (type == typeof(Foo)) 
    { 
     Console.WriteLine("execute action for Foo"); 
    } 

    if (type == typeof(Bar)) 
    { 
     Console.WriteLine("execute action for Bar"); 
    } 
} 

Les différences de performances mises à part, les deux méthodes ont le même effet. Ce qui m'interroge, c'est de savoir si c'est une bonne idée d'utiliser l'argument générique pour modifier le comportement de la méthode (faire des branchements). Cela pourrait-il être considéré comme un effet secondaire?

+0

_Les différences de performances mises à part_ - Quelles sont les différences de performances? – stuartd

+0

En supposant que vous ne pouvez pas utiliser de surcharges (pourquoi pas?), Il n'y a rien de foncièrement mauvais avec cela. – Rob

+0

Vous auriez pu mettre cette méthode sur la classe de base de Square et Circle, donc utilisez simplement l'héritage régulier. Sinon, il n'y a pas beaucoup de différence. – Evk

Répondre

0

La bonne chose à utiliser une méthode générique est que vous pouvez invoquer d'autres méthodes plus génériques sans utiliser la réflexion:

void GenericMethod<T>() 
{ 
    AnotherGenericMethod<T>(); 
} 

La méthode non générique exige une réflexion pour faire le même appel.