我经常看到(例如在许多模拟库中)使用泛型类型参数代替类型参数的方法System.Type
。我特别讨论的是泛型类型仅在typeof(T)
操作中使用的情况(即在方法中的任何地方都没有使用类型 T 的实例,并且 T 没有用于返回类型或其他参数)。
例如考虑以下方法:
public string GetTypeName(System.Type type) { return type.FullName; }
这种方法通常伴随着一个通用版本:
public string GetTypeName<T>() { return GetTypeName(typeof(T)); }
问题
是不好的做法还是好的做法?
这是语法糖还是有更多?
我认为这是滥用语言功能来缩写对接受类型参数的方法的调用System.Type
你会认为这是一种气味吗?应该避免这种情况吗?或者这实际上是一个好习惯(提供一个通用方法作为避免打字的快捷方式typeof()
)。
以下是我能想到的使用这种模式的一些实际问题:
- 如果添加了非 System.Type 类型的参数 -可能需要将方法(如果参数的顺序在语义上重要)重写为非泛型版本(否则一些参数将是泛型类型参数,而一些将是常规参数)。
- 它需要两种方法(在编译时类型未知的情况下,泛型和非泛型)。因此添加了几乎没有意义的单元测试。
另一方面,这是一种常见的做法(大多数人总是正确的,对吗?)但更重要的是,当我对需要在编译时已知的 System.Type 类型的单个参数的代码进行提取方法重构时,ReSharper 更喜欢该签名(并且我学会了接受他们的建议,尽管不是出于信仰,而是认真)。