具有泛型类型的名称

Jak*_*ote 15 c# generics c#-6.0

我试图在通用接口上获取方法的名称.我希望这可以工作,因为类型部分将是一个有效的类型:

//This does not compile
nameof(IGenericInterface<>.Method)

//This would compile
typeof(IGenericInterface<>)
Run Code Online (Sandbox Code Playgroud)

我认为这应该是有效的C#6或者我错过了什么或者是他们更好的方法来做到这一点.我不想为方法名称使用字符串,就好像方法被重命名代码会破坏而没有任何构建时错误.

das*_*ght 28

这是预料之中的.根据文档,您的表达式是不允许的,因为它引用了一个未绑定的泛型类型:

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

您可以通过提供通用参数来解决此限制:

nameof(IGenericInterface<object>.Method)
Run Code Online (Sandbox Code Playgroud)

注意:我认为Microsoft应调整nameof功能以允许引用未绑定泛型类型的方法.

  • 奇怪这是预期的,是的,我同意他们应该允许一个人如何提高他们. (3认同)
  • 在幕后,泛型基本上扩展到了它们所使用的所有类型,对吧?这可能是一个相当小的问题,但是在代码中使用“nameof(IGenericInterface&lt;object&gt;)”将生成接口“IGenericInterface&lt;object&gt;”,否则任何地方都可能不需要该接口。如果“nameof()”支持未绑定的泛型,那肯定会更有意义。 (3认同)
  • 仅供参考:“object”将无法工作,具体取决于该通用参数的任何约束 (2认同)
  • 请注意,向其传递任何内容都会强制编译器生成具有对象类型的真实类,因此请注意此缺点 (2认同)

M.k*_*ary 5

只需使用示例类型即可进行编译。

string name = nameof(IGenericInterface<int>.Method) // will be Method
Run Code Online (Sandbox Code Playgroud)