Определите необязательные элементы в XSD в c# после импорта с помощью CodeDom - PullRequest
0 голосов
/ 04 мая 2020

Я проанализировал документ XSD внутри, в котором есть некоторые дополнительные элементы. В полученном C# коде я нахожу все элементы int, decimal, datetime, ... с дополнительным полем xxxFieldSpecified. Я понимаю, что это для типов, не поддерживающих null, поэтому фреймворк может знать, был ли элемент установлен и будет использоваться. Однако есть ли способ идентифицировать эти поля при создании класса, чтобы я мог автоматически добавлять ссылку на это дополнительное поле при установке поля (используя его свойство) вместо того, чтобы устанавливать дополнительное поле все время при установке свойства, пометка свойства как установленного.

Кроме того, при анализе типов внутри XmlShemaSet мы знаем, является ли элемент массивом (ArrayRank! = 0). Однако ArrayRank всегда равен 0 или 1, хотя иногда элемент является многомерным массивом, и ArrayRank должен, например, сказать 2 ... Является ли способ идентификации многомерных массивов, созданных с использованием ArrayRank или любого другого свойства или поля?

1 Ответ

0 голосов
/ 04 мая 2020

Для вопроса 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);
        }
    }

Возможно, не очень умный, но эффективный. Если у кого-то есть другой способ сделать это ...

Второй вопрос (многомерные массивы) остается открытым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...