2012-01-11 3 views
2

Где это более целесообразно использоватьGeneric <T>() vs Generic (System.Type). Дженерики против отражения

class Entity<T> {} 

new Entity<User>() 

в отличие от

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

new Entity(typeof(User)) 

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

Это, вероятно, не относится к вам, если вам не нужно отражать.

+6

Вы используете дженерики, если дженерики решают вашу проблему, и вы используете отражение, если отражение решает вашу проблему. Какую проблему вы пытаетесь решить? – dtb

ответ

2

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

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

+0

Отлично, спасибо. Я пишу инструмент для анализа кода и создания предупреждений на основе контекстного использования языковых функций. Это хорошее понимание. –

1

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

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

0

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

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