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()