在泛型类的成员上使用nameof而不指定类型参数

时间:2015-11-19 21:58:20

标签: c# c#-6.0 nameof

class Foo<T>
{
   public T Bar() { /* ... */ }
}

我想将Bar的名字传递给Type.GetMethod(string)。我可以someType.GetMethod(nameof(Foo<int>.Bar))执行此操作,但int在这里完全是任意的;有什么办法可以省略吗?可悲的是,nameof(Foo<>.Bar)不起作用。

在这个玩具案例中并没有什么大不了的,但是如果有多个类型参数,特别是如果它们附加了where个约束,那么拼写它们就可以成为一项任务。

1 个答案:

答案 0 :(得分:3)

nameof documentation明确表示,不幸的是,您不想做的事情是:

  

因为参数需要在语法上表达,所以   许多不允许的东西对列表没用。下列   值得一提的是产生错误:预定义类型(for   例如,intvoid),可空类型(Point?),数组类型   (Customer[,]),指针类型(Buffer*),限定别名(A::B)和   未绑定的泛型类型(Dictionary<,>,预处理符号(DEBUG),   和标签(loop:)。

您可以做的最好的事情是在界面中指定Bar,然后使用nameof(IFoo.Bar)。当然,如果Bar在其签名中包含与T相关的内容(例如在此特定情况下),那么这不是一个选项。

另一种选择是创建一个界面,其中每个T都替换为object。然后具体类型显式实现接口,同时实现相同方法的通用版本。

这有一些缺点:

  • 更大的API表面
  • 更加困难且容易出错的重构
  • 失去编译时类型安全性,因为调用者可能使用object接口。

使用nameof这可能是不合理的,但在某些情况下,这种策略有其他原因。在这些情况下,能够使用nameof只是一个方便的奖励。