我正在编写一个小代码生成器,它将读入edmx文件并在模板的基础上创建业务对象。我正在使用反射来吐出类型名称。
问题是当我遇到类型为Entity Reference的属性(PropertyInfo)时(如果存在引用完整性,则基本上是实体属性),PropertyInfo.PropertyType.Name为“EntityReference`1”,但不被编译器。
PropertyInfo.PropertyType.FullName给出“System.Data.Objects.DataClasses.EntityReference`1 [[BusinessObjectGenerator.Models.BE_Additional_Info,BusinessObjectGenerator,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]”,这是也不被C#编译器识别。
现在我遇到了与Nullable类型相同的问题。我发现了静态方法Nullable.GetUnderlyingType(type)解决了这个问题。如何获取作为实体类型的属性类型的名称,C#编译器可识别的名称?
答案 0 :(得分:2)
通用类型在其名称中包含`。要获得该类型的C#可读名称,您需要首先使用 Type.IsGenericType 检查它是否是泛型类型。如果它是泛型类型,则可以使用 Type.GetGenericArguments()来获取泛型类型的类型参数列表。通过获取他们的名字,您可以将通用类型名称放在一起。例如,如果类型是
Dictionary<int, string>
然后,类型名称实际上是Dictionary`2。使用GetGenericArguments将返回一个包含两种类型(int和string)的数组。从中可以生成复合名称。
注意:从GetGenericArguments()返回的每个类型本身可能是泛型类型,因此您应该将其写为递归算法。