用CodeDom导入后,在c#中识别XSD中的可选元素。

问题描述 投票:0回答:1

我分析了一个XSD文档,里面有一些可选的元素。在生成的C#代码中,我发现每一个int,十进制,datetime,...元素都有一个额外的字段xxxFieldSpecified。我理解这是针对不支持null的类型,这样框架就可以知道该元素是否已经被设置并被使用.然而,有没有一种方法可以在生成类时识别这些字段,这样我就可以在设置字段时自动添加对这个附加字段的引用(使用它的属性),而不是在设置属性时一直设置附加字段,将属性标记为设置。

另外,在分析XmlShemaSet内部的类型时,我们知道一个元素是否是一个数组(ArrayRank != 0)。然而,ArrayRank总是0或1,尽管有时元素是一个多维数组,ArrayRank应该说是2。有没有一种方法可以识别使用ArrayRank或任何其他属性或字段生成的多维数组?

c# .net xsd
1个回答
0
投票

对于问题1(可选元素),我找到了一种方法,当我找到一个属性时,我检查字段列表,寻找属性名+"FieldSpecified"。

CodeMemberProperty m = (CodeMemberProperty)member;
if (m.HasSet)
    {
    // check if optional search for <name>FieldSpecified field
    bool optional = false;
    foreach (CodeTypeMember mtb in codeType.Members)
        if (mtb is CodeMemberField)
            if (optional = (0 == string.Compare(m.Name + "FieldSpecified", mtb.Name, true)))
                break;
    // if optional update setting flag when the property is set
    if (optional)
        {
        // set ...FieldSpecified when setting the property
        CodeAssignStatement cas = new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), m.Name + "FieldSpecified"), new CodePrimitiveExpression(true));
        m.SetStatements.Add(cas);
        }
    }

可能不是很聪明,但很有效率。如果有人有其他方法来做...。

第二个问题(多维数组)仍未解决。

© www.soinside.com 2019 - 2024. All rights reserved.