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

我想将Bar的名称传递给Type.GetMethod(string)。我可以用someType.GetMethod(nameof(Foo<int>.Bar))来做到这一点,但是int在这里完全是任意的;有什么办法可以我忽略吗?可悲的是,nameof(Foo<>.Bar)不起作用。

在这种玩具情况下,这没什么大不了的,但是如果有多个类型参数,尤其是如果它们附加了where约束,那么将它们全部拼写就可以成为一项任务。

最佳答案

nameof documentation特别指出,不幸的是,您想做的事情是被禁止的:



您可能要做的最好的事情就是在接口(interface)中指定Bar,并使用nameof(IFoo.Bar)。当然,如果Bar在签名中包含与T相关的内容(例如在此特定情况下),则不是选择。

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

这有一些缺点:

  • 较大的API表面
  • 重构困难且容易出错的
  • 由于调用者可能使用object接口(interface),因此失去了编译时类型的安全性。

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

    关于c# - 在泛型类的成员上使用nameof而不指定类型参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33815111/

    10-12 22:35