2010-01-08 78 views
1

我正在编写一个小型代码生成器,它将读入edmx文件并在模板的基础上创建业务对象。我正在使用反射来吐出类型名称。如何通过反射获取EntityReference类型的PropertyInfo.PropertyType名称

问题是当我遇到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#编译器可识别的名称?

回答

2

泛型类型在其名称中包含``。要获得C#可读的类型名称,您需要首先使用Type.IsGenericType来检查它是否是泛型类型。如果它是泛型类型,那么可以使用Type.GetGenericArguments()来获取泛型类型的类型参数列表。通过获取他们的名字,你可以把通用类型名称放在一起。例如,如果类型是

Dictionary<int, string> 

然后,类型名称实际上是Dictionary`2。使用GetGenericArguments将返回一个包含两种类型(int和string)的数组。从这些你可以生成复合名称。

注意:从GetGenericArguments()返回的每个类型本身可能是一个泛型类型,所以您应该将其作为递归算法编写。

相关问题