C#IsGenericType没有像我预期的那样工作

C#IsGenericType没有像我预期的那样工作,c#,generics,reflection,C#,Generics,Reflection,在下面的代码中,我们有两个类,Parent类使用泛型: abstract class Parent<T> { public T Put(T id, char value) { return id; } } class Child : Parent<int> { public string Get(Guid guid) { return "aei"; } } 和输出: Get g

在下面的代码中,我们有两个类,
Parent
类使用泛型:

abstract class Parent<T> 
{
    public T Put(T id, char value) 
    {
        return id;
    }
}

class Child : Parent<int> 
{
    public string Get(Guid guid) 
    {
        return "aei";
    }
}
和输出:

Get
  guid IsGenericType=False
Put
  id IsGenericType=False
  value IsGenericType=False

结果是正确的<代码>子项不是中的泛型

class Child<T> : Parent<T>
因此
id
不是泛型类型,而是
int
类型


编辑:

获取这些信息的方法可以是这样的:

Type childType = typeof(Child);
MethodInfo childPut = childType.GetMethod("Put");

// get the type that initially declared the method
Type declaringType = childPut.DeclaringType;

if (declaringType.IsGenericType)
{
    // get the generic type definition (not the constructed Parent<int>)
    Type genericType = declaringType.GetGenericTypeDefinition();
    MethodInfo genericMethod = genericType.GetMethod("Put");
    ParameterInfo genericParam = genericMethod.GetParameters().First();

    // use IsGenericParameter - we want to know that the type is determined
    // by a generic argument, not if that type argument itself is generic
    Console.WriteLine(genericParam.ParameterType.IsGenericParameter);
}
Type childType=typeof(Child);
MethodInfo childPut=childType.GetMethod(“Put”);
//获取最初声明该方法的类型
类型declaringType=childPut.declaringType;
if(declaringType.IsGenericType)
{
//获取泛型类型定义(不是构造的父级)
类型genericType=declaringType.GetGenericTypeDefinition();
MethodInfo genericMethod=genericType.GetMethod(“Put”);
ParameterInfo genericParam=genericMethod.GetParameters().First();
//使用IsGenericParameter-我们想知道类型已确定
//通过泛型参数,而不是如果该类型参数本身是泛型的
Console.WriteLine(genericParam.ParameterType.IsGenericParameter);
}

这将为您的(特殊)情况输出
true
。我不知道您的要求,该方法应该适用于哪些类型。正如我在评论中所说的,要使它成为一个能够为所有环境的每个参数确定它的算法,对我来说似乎很复杂。

您正在循环子类的方法和参数,而不是父类

   var methodInfo in typeof(Child).GetMethods()
子类已经初始化了一个对象,该对象的方法是int类型参数,而不是泛型类型。这就是泛型的工作原理

即使您使用父类循环它,您也需要将其编写为

var methodInfo in typeof(Parent<int>).GetMethods()
typeof(Parent.GetMethods()中的var methodInfo 及

typeof(Parent).GetMethods()中的var methodInfo将不起作用,因为T本身不是类型

正如下面的评论所指出的

var methodInfo in typeof(Parent<>).GetMethods() 
typeof(Parent.GetMethods()中的var methodInfo
确实有效。

T
不是泛型类型,它是一个不同的类型


泛型类型是
SomeType
,但
T
可以是
string
int
或其他非泛型类型的类型。

我的疑难解答是从Swashback中的一个问题开始的:该链接中的格式非常复杂awful@vc74我正要打那个,对吧,以防万一有人遇到同样的问题,下面是工作代码:…如果我正确理解了这一点,就无法检测我的计算机上的参数是否为泛型case@HelderSepu您的代码确实测试了这一点。关键是方法
Child.Put
的此参数
id
的类型。Put不是泛型。@HelderSepu如果您想知道此方法是否派生自构造泛型类型的类…这是一个非常广泛的问题,我想所有可能的类设计的算法都会非常复杂。这都是关于参数
id
必须有一种方法来识别(使用反射)它是
T
,正如我在下面的评论中提到的,您应该使用param.ParameterType.IsGenericParameter最后一句话不太正确,
typeof(Parent).GetMethods()
有效。是的,因为当您在大括号之间将其留空时,它将param.ParameterType作为T。在大括号之间不使用特定的T。它仍将param.ParameterType.IsGenericType指定为false。为什么?因为这是一个方法使用错误。他应该使用param.ParameterType.IsGenericParameter,它为您的语法提供true。我也在修改最后一行的答案。
var methodInfo in typeof(Parent<int>).GetMethods()
var methodInfo in typeof(Parent<>).GetMethods()