简短的答案是 typeof(Q)。
长答案(试图解释为什么你不能枚举这些类型并且必须专门编写它们)如下所示:
每个通用方法(比它声明的类更通用)都有对应的、不同的 MethodInfo 实例(用于其所有(曾经)接触过的详细信息)和另一个用于“模板”/打开方法的 MethodInfo 实例。
您可以使用它来获得您想要的东西:
class ConcreteFoo {
public void GenericMethod<Q>(Q q) {
var method = MethodInfo.GetCurrentMethod();
var closedMethod = method.MakeGenericMethod(typeof(Q));
// etc
}
}
这是为什么 ?
这是因为反射中的“枚举操作”都不会返回引用封闭详细化的 MethodInfo 实例。
如果您像这样枚举 ConcreteFoo 声明的静态方法:
var atTime1 = typeof(ConcreteFoo).GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly);
ConcreteFoo.GenericMethod( true );
var atTime2 = typeof(ConcreteFoo).GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly);
你会得到相同的结果。
就泛型方法及其具体化而言,您将仅获得与泛型方法(开放变体)关联的反射对象。
atTime2 将不包含引用新编译的 GenericMethod 的额外 MethodInfo。
但这并不是一件坏事,不是吗?
GetMethods() 应返回一致的结果,并且其结果不会随时间变化。
当涉及到“导航”操作时,泛型方法的代数实际上非常好:
- 所有打开的 MethodInfo 都具有 IsGenericMethod = true 和 IsGenericMethodDefinition = true
- 所有关闭的 MethodInfo 都具有 IsGenericMethod = true 和 IsGenericMethodDefinition = false
- 通过在封闭的 MethodInfo 上调用 .GetGenericMethodDefinition(),您可以获得开放的 MethodInfo
- 通过在开放的 MethodInfo 上调用 .MakeGenericType(params Type[] types) ,您可以获得所需的任何封闭类型(在语法上不知道这些类型是什么,并且有可能因不尊重 where 子句而收到异常)
对于来自当前线程的角度(而不是从程序集和类型的角度)的反射操作也是如此:
MethodBase MethodInfo.GetCurrentMethod()
and
StackTrace trace = new StackTrace();
IEnumerable<MethodBase> methods = from frame in trace.GetFrames()
select frame.GetMethod();
从不返回泛型方法的实际封闭变体(如果有)
实际上位于顶部或整个当前调用堆栈。
在某种程度上,你的问题并不荒谬,因为,在这种情况下获取当前方法你可以轻松地将其替换为获取当前方法 plus 生成通用方法加上语法上可用的类型(随便),你不能这样说你的来电者。
因此......对于非泛型方法,您始终可以查看堆栈并准确了解这些方法的参数类型。相互调用的方法,最终你的方法被调用......但是对于通用方法(它们确实是真正封闭的,因为我重复一遍,认为运行并调用另一个方法并被其他人调用的通用方法是不合逻辑的(等等) )是一个开放的)你无法找出参数的类型,就像你无法了解任何此类方法的局部变量的值一样(它们是确定性的,但使其成为性能上的一个很大的缺陷可能性)。