CodeTypeReference.ArrayRank 备选方案
CodeTypeReference.ArrayRank alternative
我正在使用 CodeDom 从 XSD 文件构建智能 类。
为此,我创建了以下内容
XmlSchemaImporter schemaImporter = new XmlSchemaImporter(xsds);
CodeNamespace codeNamespace = new CodeNamespace(settings.Nmspace);
// export the code inside the namespace
XmlCodeExporter codeExporter = new XmlCodeExporter(codeNamespace, null, CodeGenerationOptions.GenerateProperties);
// load objects fromm the XSD
var maps = new List<XmlTypeMapping>();
foreach (XmlSchema schema in xsds)
{
if (settings.UseTypes)
{
foreach (XmlSchemaType schemaT in schema.SchemaTypes.Values)
maps.Add(schemaImporter.ImportSchemaType(schemaT.QualifiedName));
}
if (settings.UseElements)
{
foreach (XmlSchemaElement schemaT in schema.Elements.Values)
maps.Add(schemaImporter.ImportTypeMapping(schemaT.QualifiedName));
}
//if (settings.UseNotations)
// {
// foreach (XmlSchemaNotation schemaT in schema.Notations.Values)
// maps.Add(schemaImporter.ImportTypeMapping(schemaT.QualifiedName));
// }
}
// export all selected objects to the namespace code
foreach (var map in maps)
codeExporter.ExportTypeMapping(map);
// process the files to update classes and other objects
CodeNamespace newCodeNamespace = PostProcess(settings, codeNamespace);
在 XSD 内部是一些多维数组(在生成的代码中给出类似“byte[][] myarray;”的内容)。
当我解析在 XSD 中找到的所有成员并且解析器到达这些多维数组之一时,CodeMemberField 或 CodeMemberProperty 包含一个类型 属性,其中包含一个 ArrayRank 属性 应该表示数组的维数(https://docs.microsoft.com/en-us/dotnet/api/system.codedom.codetypereference.arrayrank?view=dotnet-plat-ext-5.0)
但是 property.Type.ArrayRank 始终设置为 1,无论维数是多少。
当我调试应用程序时,我可以在 Type one(这是一个 CodeTypeReference)中看到另一个名为 NestedArrayDepth 的 属性,它指示 2(正确的维度数),而 ArrayRank 仍设置为 1,如您在此处所见
不知道是框架的bug还是故意的
我的问题是:如何使用 CodeDom 获得实际的维数?有什么我不知道或不怀疑的把戏吗?
我终于找不到办法了。
它实际上是一个参差不齐的数组,尽管 CodeDom 似乎识别了它,但我不知道如何获取信息。
我通过替换 byte[][] 类型和 objects[] 类型解决了我的问题,并且在我找到另一种方法之前会处理我在访问这些数据时所做的事情。
好伤心...
我正在使用 CodeDom 从 XSD 文件构建智能 类。 为此,我创建了以下内容
XmlSchemaImporter schemaImporter = new XmlSchemaImporter(xsds);
CodeNamespace codeNamespace = new CodeNamespace(settings.Nmspace);
// export the code inside the namespace
XmlCodeExporter codeExporter = new XmlCodeExporter(codeNamespace, null, CodeGenerationOptions.GenerateProperties);
// load objects fromm the XSD
var maps = new List<XmlTypeMapping>();
foreach (XmlSchema schema in xsds)
{
if (settings.UseTypes)
{
foreach (XmlSchemaType schemaT in schema.SchemaTypes.Values)
maps.Add(schemaImporter.ImportSchemaType(schemaT.QualifiedName));
}
if (settings.UseElements)
{
foreach (XmlSchemaElement schemaT in schema.Elements.Values)
maps.Add(schemaImporter.ImportTypeMapping(schemaT.QualifiedName));
}
//if (settings.UseNotations)
// {
// foreach (XmlSchemaNotation schemaT in schema.Notations.Values)
// maps.Add(schemaImporter.ImportTypeMapping(schemaT.QualifiedName));
// }
}
// export all selected objects to the namespace code
foreach (var map in maps)
codeExporter.ExportTypeMapping(map);
// process the files to update classes and other objects
CodeNamespace newCodeNamespace = PostProcess(settings, codeNamespace);
在 XSD 内部是一些多维数组(在生成的代码中给出类似“byte[][] myarray;”的内容)。
当我解析在 XSD 中找到的所有成员并且解析器到达这些多维数组之一时,CodeMemberField 或 CodeMemberProperty 包含一个类型 属性,其中包含一个 ArrayRank 属性 应该表示数组的维数(https://docs.microsoft.com/en-us/dotnet/api/system.codedom.codetypereference.arrayrank?view=dotnet-plat-ext-5.0)
但是 property.Type.ArrayRank 始终设置为 1,无论维数是多少。
当我调试应用程序时,我可以在 Type one(这是一个 CodeTypeReference)中看到另一个名为 NestedArrayDepth 的 属性,它指示 2(正确的维度数),而 ArrayRank 仍设置为 1,如您在此处所见
不知道是框架的bug还是故意的
我的问题是:如何使用 CodeDom 获得实际的维数?有什么我不知道或不怀疑的把戏吗?
我终于找不到办法了。 它实际上是一个参差不齐的数组,尽管 CodeDom 似乎识别了它,但我不知道如何获取信息。
我通过替换 byte[][] 类型和 objects[] 类型解决了我的问题,并且在我找到另一种方法之前会处理我在访问这些数据时所做的事情。
好伤心...