【问题标题】:Type.IsPrimitive working for generic types?Type.IsPrimitive 适用于泛型类型?
【发布时间】:2020-05-19 18:25:44
【问题描述】:

如果我写下面的泛型方法:

static bool HelloWorld<TSource>(TSource input)
{
    return typeof(TSource).IsPrimitive;
}

我将int 传递给它,它成功地将其识别为原语。例如,如果我传递一个字符串,它不会 - 这意味着它可以工作。

documentation 声明它不应该工作,或者我错过了什么?

如果当前 Type 表示一个泛型类型,或者是一个类型参数 泛型类型或泛型方法的定义,此属性 总是返回 false。

【问题讨论】:

  • ~IsPrimitive 返回 true,因为您询问的是泛型参数 of 的类型,而不是泛型 type。对于typeof(Foo&lt;int&gt;) 之类的东西,它会返回 false,这是一个泛型类型,类型参数是原始的。~对不起,我自己看错了。

标签: c# generics .net-core reflection types


【解决方案1】:

你已经回答了你自己的问题......你说:

我将int 传递给它,它成功地将其识别为原语

如果您传递了int,那么TSource int,并且不是“泛型类型”或“类型参数”。

当文档说“类型参数”时,它指的是一个Type 对象,其IsGenericParameter 属性为真。

你可以得到这样一个Type对象,例如

typeof(List<>).GetGenericArguments()[0] // this will give a Type object that represents a type parameter

注意这里使用了非构造类型List&lt;&gt;,这很关键。

要获取方法的类型参数,需要获取方法的MethodInfo,并调用GetGenericArguments

【讨论】:

  • To get the type parameter of your method, you need to get the MethodInfo of your method, and call GetGenericArguments. - 你的意思是说,如果我想使用反射来获取泛型方法的参数,我就必须做上面的,对吧?
  • @SpiritBob 我的意思是如果你想将泛型方法的类型参数作为TypeIsGenericParameter 属性为true,你需要使用反射。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 2023-02-11
  • 2012-01-22
  • 1970-01-01
相关资源
最近更新 更多