2016-11-04 4 views
0

В C#, как правило, плохой практикой использовать общий аргумент для изменения поведения универсального метода?Развертывание общего типа CLR на основе типа общего аргумента

В примере:

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

Различия производительности в стороне, оба метода будет иметь тот же эффект.

Что мне интересно, так это хорошая идея использовать общий аргумент для изменения поведения метода (для ветвления). Можно ли это считать побочным эффектом?

+0

_Отличия в производительности в сторону_ - Какие отличия в производительности существуют? – stuartd

+0

Предполагая, что вы не можете использовать перегрузки (почему бы и нет?), В этом нет ничего неправильного. – Rob

+0

Вы могли бы поместить этот метод в базовый класс как Square, так и Circle, поэтому просто используйте регулярное наследование. В противном случае нет большой разницы. – Evk

ответ

0

Хорошая вещь об использовании общего метода является то, что вы можете в дальнейшем вызывать другие общие методы без использования отражения:

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

НЕРАСПРОСТРАНЕНИЯ общего метод требует отражений, чтобы сделать тот же вызов.

Смежные вопросы