C# -- 了解泛型类型的基类型
本文关键字:基类 类型 泛型类型 了解 | 更新日期: 2023-09-27 18:34:03
如何找出泛型类型的基类型?
例如
Func<A, B>
我希望能够说这是一个Func<>但显然,Func<,>与Func不同<> - 有没有办法以某种方式抓住它们,或者Func<,,,>等等?
您正在寻找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
泛型参数,在用具体的类型参数(如int
或string
引用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<,,>
不是同一类型。