解剖通用类型

时间:2011-01-12 19:18:27

标签: c#

假设tSystem.Type类型的变量,其值为

System.Collections.Generic.Dictionary`2[System.String,System.Int32]

我可以在t上调用一种方法,以便它返回:

System.Collections.Generic.Dictionary

否则,我正在考虑调用.ToString()并使用正则表达式(yuck)

3 个答案:

答案 0 :(得分:2)

没有System.Collections.Generic.Dictionary。但是你可以通过调用

获得System.Collections.Generic.Dictionary`2(即相当于typeof(Dictionary<,>)
t.GetGenericTypeDefinition()

答案 1 :(得分:1)

您可以调用GetGenericTypeDefinition()方法,该方法将产生“通用”类型。这仍然会附加`2。那是因为编译它的真实类型名称(2是通用参数的计数)。从那里我认为你别无选择,只能使用字符串操作。

答案 2 :(得分:1)

扩展Timwi'sVilx-'s个答案,您可以编写一个方法来执行以下操作:

// Omitted null checking, type validation, etc. for brevity
static string GetNonGenericTypeName(Type genericType)
{
    Type baseType = genericType.GetGenericTypeDefinition();

    // This is PROBABLY fine since the ` character is not allowed in C# for one of
    // your own types.
    int stopIndex = baseType.FullName.IndexOf('`');

    return baseType.FullName.Substring(0, stopIndex);
}

附录:上述方法(除了缺乏来自未验证输入的鲁棒性)受到限制,可能会也可能不会很大,具体取决于它假设的范围used:它假设反引号字符(`)只在出现在类名中,如果它被C#编译器放在那里;换句话说,它假设它检查的任何类都来自BCL(我不会相信包括其名称中带有反引号的任何类型,当然除了通用的类型之外)或写入C#,“正常”方式(例如,不使用某些动态类型定义库)。

它也适用于VB.NET和其他.NET语言,但我对这些语言的命名规则不太熟悉,所以我目前无法肯定地说。

如果您只在自己的内部库中使用此方法,那么显然您可以控制非泛型类名称中反引号的可能存在是否切合实际甚至可能。如果它在公共图书馆,那么它很容易返回不正确的结果,我称之为“异国情调”但完全合法的CLR类型。