Общий <T>() против Универсальный (System.Type). Дженерикс против отражения - PullRequest
2 голосов
/ 11 января 2012

Где лучше использовать

class Entity<T> {}

new Entity<User>()

в отличие от

class Entity
{
   public Entity(System.Type type) 
   {
   }
}

new Entity(typeof(User))

Я понял значение System.Type после работы с отражением и генерацией кода. После месяца разработки и знакомства я скептически смотрю на свой выбор.

Возможно, это не относится к вам, если вам не нужно размышлять.

Ответы [ 3 ]

2 голосов
/ 11 января 2012

Универсальный подход Entity<T> имеет возможность использовать ограничения универсального типа для обеспечения соблюдения правил и функций во время компиляции (т. Е. T должен иметь открытый конструктор без параметров и, например, ссылочный тип). Для каждого типа не требуется места для хранения типа, поскольку Entity<X> и Entity<Y> являются дискретными типами, но в качестве повторного утверждения этого: у вас не может быть гетерогенного List<Entity<?>> (если у вас нет общего базовый тип) по той же причине.

Гораздо сложнее использовать дженерики, если тип известен только во время выполнения.

1 голос
/ 11 января 2012

Это зависит от того, что у вас внутри сущности. Есть ли у вас поля типа T или параметры для методов типа T в классе Entity? Если вы только когда-либо делаете typeof(T) внутри Entity, тогда, вероятно, будет проще передать System.Type, как во втором примере.

Другое отличие состоит в том, что вы можете использовать ограничения с обобщениями, чтобы вы могли сделать class Entity<T> where T: ISomeInterface

0 голосов
/ 11 января 2012

Если вы используете второй подход, вы будете приводить объект типа пользовательский объект (который, скорее всего, будет) каждый раз в классе сущностей. Где, как если бы вы использовали общий, т.е. первый подход, вам это не потребуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...