class Foo<T>
{
public T Bar() { /* ... */ }
}
我想将Bar的名字传递给Type.GetMethod(string)
。我可以someType.GetMethod(nameof(Foo<int>.Bar))
执行此操作,但int
在这里完全是任意的;有什么办法可以省略吗?可悲的是,nameof(Foo<>.Bar)
不起作用。
在这个玩具案例中并没有什么大不了的,但是如果有多个类型参数,特别是如果它们附加了where
个约束,那么拼写它们就可以成为一项任务。
答案 0 :(得分:3)
nameof
documentation明确表示,不幸的是,您不想做的事情是:
因为参数需要在语法上表达,所以 许多不允许的东西对列表没用。下列 值得一提的是产生错误:预定义类型(for 例如,
int
或void
),可空类型(Point?
),数组类型 (Customer[,]
),指针类型(Buffer*
),限定别名(A::B
)和 未绑定的泛型类型(Dictionary<,>
),预处理符号(DEBUG
), 和标签(loop:
)。
您可以做的最好的事情是在界面中指定Bar
,然后使用nameof(IFoo.Bar)
。当然,如果Bar
在其签名中包含与T
相关的内容(例如在此特定情况下),那么这不是一个选项。
另一种选择是创建一个界面,其中每个T
都替换为object
。然后具体类型显式实现接口,同时实现相同方法的通用版本。
这有一些缺点:
object
接口。使用nameof
这可能是不合理的,但在某些情况下,这种策略有其他原因。在这些情况下,能够使用nameof
只是一个方便的奖励。