C# -- 了解泛型类型的基类型

本文关键字:基类 类型 泛型类型 了解 | 更新日期: 2023-09-27 18:34:03

如何找出泛型类型的基类型?

例如

 Func<A, B>

我希望能够说这是一个Func<>但显然,Func<,>与Func不同<> - 有没有办法以某种方式抓住它们,或者Func<,,,>等等?

C# -- 了解泛型类型的基类型

您正在寻找GetGenericTypeDefinition

var t = typeof(Func<int, string>);
var tGeneric = t.GetGenericTypeDefinition();
Assert.AreEqual(typeof(Func<,>), tGeneric);

如果你想知道一个类型是否是众多Func<>变体之一,那么你最好的办法就是做这样的事情。 检查类型名称,正如其他地方所建议的那样,绝对不是检查类型标识的方法:

static Type[] funcGenerics = new[]{
  typeof(Func<>), typeof(Func<,>), typeof(Func<,,>), typeof(Func<,,,>),
  /* and so on... */
}
//there are other ways to do the above - but this is the most explicit.

static bool IsFuncType(Type t)
{
  if(t.IsGenericTypeDefinition)
    return funcGenerics.Any(tt => tt == t);
  else if(t.IsGenericType) 
    return IsFuncType(t.GetGenericTypeDefinition());
  return false;
}
你的

术语不正确——我怀疑为什么你的问题被投了反对票。 基类型是类型继承自的类型(不是接口,接口是不同的,尽管在概念上非常相似(。

泛型类型定义最好被认为是类似于模板(那里的强限定,因为术语"模板"用于C++,虽然外观相似,但它们在实现中却大不相同(。

更准确地说,Func<,>是泛型类型定义,而Func<int, string>封闭泛型("泛型类型"(。

你也可以有一个开放的泛型,其中类型参数是泛型参数 - 例如,给定:

class MyType<T> : List<T> { }

然后List<T>是一个泛型类型定义List<>的开放泛型,因为T泛型参数,在用具体的类型参数(如intstring引用MyType<T>之前,它不会被关闭。

最后,仅仅因为一堆泛型类型共享相同的通用名称,例如 Func<>Func<,>Func<,,>这并不意味着它们有任何关系。 在类型级别,没有显式连接,这就是为什么您必须检查所有这些类型标识,以及为什么没有您所说的公共"基础"。 但是,如果它们都有一个通用接口或基类,那么您可以通过检查与该接口或基类型的兼容性来。

给定泛型类型定义,你可以使用 MakeGenericType 构造泛型类型,正如 Jeffrey Zhang 所提到的。

不,你不能,没有日耳曼语类型的基本类型。如果要按类型参数获取特定的泛型类型,可以使用MakeGenericType 。例如:

//get Func<int, string> type
typeof(Func<>).MakeGenericType(typeof(int), typeof(string));

如果要从指定的泛型类型获取泛型类型,可以使用 GetGenericTypeDefinition 。例如:

//get Func<,> type
typeof(Func<int, string>).GetGenericTypeDefinition();
这是因为

Func< A, B >不继承自Func<> 它是一个基于Func<,>的泛型。

但是,您会注意到

typeof(Func<int, int>).FullName // equals "System.Func`2...
typeof(Func<int, int, int>).FullName // equals "System.Func`3...

它有点丑,但你可以使用类似的东西

YourType.FullName.StartsWith("System.Func")

希望对你有帮助

编辑:为什么不使用YourType.GetGenericTypeDefinition()

因为typeof(Func<int, int>).GetGenericTypeDefinition()回报Func<,>

typeof(Func<int, int, int>).GetGenericTypeDefinition()返回Func<,,>.

Func<,>Func<,,>不是同一类型。