有没有办法获取未绑定泛型类型的参数数量?例如:
f(typeof(List<>)) => 1
f(typeof(Dictionary<,>)) => 2
更新
我知道从 Type.Name 中获取数字,但也许有一种直接从 Type 获取的方法。
有没有办法获取未绑定泛型类型的参数数量?例如:
f(typeof(List<>)) => 1
f(typeof(Dictionary<,>)) => 2
更新
我知道从 Type.Name 中获取数字,但也许有一种直接从 Type 获取的方法。
您已经拥有通用类型定义。您需要做的就是获取通用类型参数:
Type.GetGenericArguments().Length
编辑:
正如Sebastian所提到的,如果你习惯于处理C#,这可能会给你带来令人惊讶的结果,因为C#隐藏了“继承”的泛型类型参数。例如:
void Main()
{
typeof(A<>.Nested<>).GetGenericArguments().Dump();
}
public class A<T>
{
public class Nested<V>
{
}
}
这将会给你{ typeof(T), typeof(V) }
。这只是.NET类的实际表现方式 - 这就是你需要引用它的方式,以及通过反射创建它的方式等。
这仅在您特别想要在与编译时未知的类有关的C#编译器中执行某些操作时才有意义;这可能意味着您正在尝试生成C#代码。似乎没有任何支持的方法可以安全地获得C#所具有的行为 - 您只需使用真正的代码生成器而不是随意拼接字符串即可 :)
OuterClass<,>.InnerClass<>
,您将得到3
而不是1
。 - Sebastian Krysmanskipublic static int GetGenericParameterCount(Type type)
{
if (!type.IsGenericType)
{
return 0;
}
var genericTypeDefName = type.GetGenericTypeDefinition().Name;
int tickIndex = genericTypeDefName.LastIndexOf('`');
if (tickIndex == -1)
{
// This will happen for nested types like "OuterClass<int>.InnerClass".
return 0;
}
return int.Parse(genericTypeDefName.Substring(tickIndex + 1), NumberStyles.None);
}
type.GetGenericArguments().Length
来获取相同的数字,然后在嵌套类型的情况下,减去外部类型的相同指标 (type.DeclaringType
)。请参见我的答案。 - stakx - no longer contributing只需查询t.GetGenericArguments().Length
即可找到某个类型t
的泛型参数(或参数)的总数:
static int GenericParameterCount(this Type t)
=> t.IsGenericType ? t.GetGenericArguments().Length
: 0;
static int LocalGenericParameterCount(this Type t)
=> t.IsNested ? t.GenericParameterCount() - t.DeclaringType.GenericParameterCount()
: t.GenericParameterCount();