从包含通用ObservableCollection的Type(System.type)获取字符串“System.Collections.ObjectModel.ObservableCollection”?

时间:2011-12-01 09:47:12

标签: c# observablecollection

我有一个FullName为的Type(如果这有帮助):

"System.Collections.ObjectModel.ObservableCollection`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"

从那个Type中,我想把"System.Collections.ObjectModel.ObservableCollection"作为一个字符串,但我想“干净地”这样做,这意味着,不要将字符串与char '`'分开。 我认为策略是获得类似Type或其他FullName将为"System.Collections.ObjectModel.ObservableCollection"的东西,但我真的无法做到:/

2 个答案:

答案 0 :(得分:3)

“真实”类型名称不是System.Collections.ObjectModel.ObservableCollection,而是System.Collections.ObjectModel.ObservableCollection`1,因为VirtualBlackFox正确提及(因为它是泛型类型,`1表示通用参数的数量)。

使用type.Name(提供ObservableCollection`1)和type.Namespace(提供System.Collections.ObjectModel)可以非常接近。

并非您的类型很可能不是泛型类型,而是其通用参数= string的规范。

您可以使用type.GetGenericArguments()获取参数类型(string)。

答案 1 :(得分:2)

只是为了补充弗拉德的答案,不要接受我的。

`字符在CLI(ECMA-335)规范中直接指定,因此解析它是安全且“干​​净的”(只要您的C#代码在CLI基础结构下运行):

10.7.2

  

符合CLS的通用类型名称使用该格式进行编码   "name[`arity]",其中[...]表示坟墓   重音字符"`"和arity在一起是可选的。   编码名称应遵循以下规则:

     
      
  1. name应为不包含"`"字符的ID(参见Partition II)。
  2.   
  3. arity指定为无符号十进制数,不带前导零或空格。
  4.   
  5. 对于普通泛型类型,arity是在类型上声明的类型参数的数量。
  6.   
  7. 对于嵌套泛型类型,arity是新引入的类型参数的数量。
  8.