使用泛型类型参数代替System.Type类型的参数.这是一种气味吗?

THX*_*138 13 c# coding-style

我经常看到(例如在许多模拟库中)方法,其中使用泛型类型参数来代替类型的参数System.Type.我特别谈到泛型类型仅在typeof(T)操作中使用的情况(即,在方法中的任何地方都没有使用类型T的实例,并且T不用于返回类型或其他参数).

例如,考虑以下方法:

public string GetTypeName(System.Type type) { return type.FullName; }
Run Code Online (Sandbox Code Playgroud)

这种方法通常伴随着通用版本:

public string GetTypeName<T>() { return GetTypeName(typeof(T)); }
Run Code Online (Sandbox Code Playgroud)

问题 是一种不好的做法还是一种好的做法?
这是一种语法糖还是还有更多呢?

我认为这是滥用语言功能来缩写对接受类型参数的方法的调用 System.Type

你觉得这有气味吗?这应该避免吗?或者这实际上是一种很好的做法(提供通用方法作为避免键入的快捷方式typeof()).

以下是使用我能想到的这种模式的一些实际问题:

  1. 如果添加了非System.Type类型的参数 - 可能需要将方法重写(如果参数的顺序在语义上很重要)到非泛型版本(否则一些参数将是泛型类型参数,而一些参数将是常规参数).
  2. 它需要两个方法(对于在编译时未知类型的情况,通用和非通用).因此增加了几乎毫无意义的单元测试.

另一方面,这是一种常见的做法(大多数总是正确的,对吧?)但更重要的是,当我对需要在编译时知道System.Type类型的单个参数的代码进行Extract Method重构时,ReSharper更喜欢该签名(和我学会了接受他们的建议,虽然不是出于信仰,但认真地).

Fed*_*gui 0

处理类型的方法通常只做以下事情:处理类型。

IMO,Class.Method<SomeType>();Class.Method(typeof(SomeType));

但我想这是一个观点问题。

以 LINQ.OfType<T>()为例:

personlist.OfType<Employee>().Where(x => x.EmployeeStatus == "Active");
Run Code Online (Sandbox Code Playgroud)

相对:

personlist.OfType(typeof(Employee)).Where(x => ((Employee)x).EmployeeStatus == "Active");
Run Code Online (Sandbox Code Playgroud)

您更喜欢哪一个?

  • `OfType` 方法的签名是: `public static IEnumerable&lt;TResult&gt; OfType&lt;TResult&gt;(this IEnumerable source)` 类型参数用于返回类型。如果不将结果简化为“IEnumerable&lt;object&gt;”,则无法使用 typeof(Employee) 重写此方法。 (4认同)