2012-01-11 85 views
2

它在哪里更合适使用Generic <T>()vs Generic(System.Type)。泛型VS反射

class Entity<T> {} 

new Entity<User>() 

,而不是

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

new Entity(typeof(User)) 

我意识到对付反射和代码生成后的System.Type的意义。经过一个月的发展和熟悉,我怀疑地回顾自己的选择。

这可能不适用于你,如果你不需要反思。

+6

如果泛型能够解决您的问题,则使用泛型,如果反射解决了您的问题,则使用反射。你想解决哪个问题? – dtb 2012-01-11 06:26:59

回答

2

通用方法Entity<T>能够在编译时使用泛型约束来强制执行规则和特征(例如,T必须具有公共无参数构造函数并且是引用类型)。它不需要每个实例的类型的存储空间,因为Entity<X>Entity<Y>是谨慎的类型 - 但作为一个重申声明:你不能有一个异构的List<Entity<?>>(除非你有一个共同的基类型)同样的道理。

如果仅在运行时才知道类型,那么使用泛型要困难得多。

+0

完美,谢谢。我正在编写一个工具来分析代码并根据语言功能的上下文使用情况生成警告。这是很好的见解。 – 2012-01-12 07:19:11

1

这取决于你有什么内部的实体。在Entity类中,是否有任何类型为T或T参数的字段?如果你只在Entity内部做过typeof(T)那么它可能会比第二个例子中的System.Type更简单。

另一个不同之处是,你可以使用约束带泛型,所以你可以做class Entity<T> where T: ISomeInterface

0

如果使用第二种方法,你将有类型转换用户对象(你都会有,最有可能)每次实体类。就像你使用通用即第一种方法一样,你不需要这样做。