C # XML-сериализация: присвоить одно и то же значение несколько раз - PullRequest
2 голосов
/ 03 июля 2019

Я использую флаги enum в проекте, над которым я работаю, и много XML-сериализации. Я хотел бы иметь возможность назначить несколько различных флагов перечисления для одного параметра перечисления. Проблема, с которой я сталкиваюсь, заключается в том, что значения будут назначаться только один раз, в то время как я хочу иметь возможность назначать несколько перечислений.

У меня есть рабочее решение, использующее строки и массив:

[XmlElement("AddTags")]
public string[] AddTags
{
    set
    {
        if (value != null)
            foreach (string tag in value)
            {
                if (tag.Contains(","))
                {
                    string[] split = tag.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                    foreach (string str in split)
                        Tags = (Tags | (int)EnumUtil.GetIndex<Tag>(str));
                }
                else
                    Tags = (Tags | (int)EnumUtil.GetIndex<Tag>(tag));
            }
    }
    get
    {
        return EnumUtil.GetNamesInTag<Tag>(Tags).ToArray();
    }
}

Что дает мне желаемый результат, за исключением того, что я бы предпочел просто использовать сериализованное перечисление. XML для этого будет выглядеть так:

<AddTags>Tag1</AddTags>
<AddTags>Tag2</AddTags>

И все должны быть установлены в одно целое, содержащее каждый из перечисленных флагов.

В идеале это будет работать с тем же XML:

[Flags]
public enum Tag
{
    Tag1     = 1 << 00,
    Tag2     = 1 << 01,
    Tag3     = 1 << 02,
}
public int Tags;
public Tag AddTags
{
    set
    {
        Tags = (Tags | (int)value);
    }
    get
    {
        return (Tag)Tags;
    }
}

К сожалению, xml назначит AddTags только один раз, независимо от того, сколько раз AddTags больше не является массивом. Я хотел бы иметь возможность присвоить это значение несколько раз, используя один и тот же XML, и без создания массива, так как я чувствую, что это слишком сложно. Спасибо.

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