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),也实现相同方法的通用版本。
这有一些缺点:
object
接口(interface),因此失去了编译时类型的安全性。 仅使用
nameof
可能不合理,但是在某些情况下,出于其他原因,这种策略是有意义的。在那些情况下,能够使用nameof
只是一个方便的奖励。关于c# - 在泛型类的成员上使用nameof而不指定类型参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33815111/