使用Flags Enum的XElement

时间:2017-03-15 15:57:59

标签: c# xelement enum-flags

在我的代码中,我每周都有一个Flags Enum,如下所示:

[Flags]
public enum DaysOfWeek          // enumeration for days of week
{
    Sunday = 0x0000001,
    Saturday = 0x0000010,
    Friday = 0x0000100,
    Thursday = 0x0001000,
    Wednesday = 0x0010000,
    Tuesday = 0x0100000,
    Monday = 0x1000000,
    MondayToFriday = Monday | Tuesday | Wednesday | Thursday | Friday,
    MondayToSaturday = MondayToFriday | Saturday,
    NotSaturday = MondayToFriday | Sunday,
    Weekend = Saturday | Sunday,
    MondayToSunday = MondayToFriday | Weekend,
    HolidaysOnly = ~MondayToSunday,
}

我在下面的简化示例中使用它来输出XML:

List<DaysOfWeek> profiles = new List<DaysOfWeek>();
profiles.Add(DaysOfWeek.MondayToFriday);
profiles.Add(DaysOfWeek.MondayToSaturday);
profiles.Add(DaysOfWeek.Monday | DaysOfWeek.Tuesday);

XElement xml = new XElement("Profiles",
                 from DaysOfWeek pf in profiles 
                 select new XElement("Profile",pf.ToString())
               );
Console.WriteLine(xml);

这给了我输出:

<Profiles>
    <Profile>MondayToFriday</Profile>
    <Profile>MondayToSaturday</Profile>
    <Profile>Tuesday, Monday</Profile>
</Profiles>

但我想要的是:

<Profiles>
    <Profile>
        <MondayToFriday />
    </Profile
    <Profile>
        <MondayToSaturday />
    </Profile>
    <Profile>
        <Monday />
        <Tuesday />
    </Profile>
</Profiles>

我很欣赏我的XElement的格式需要扩展,以便我在一周中得到空元素,但如果我这样做,那么&#34;星期二,星期一&#34; element抛出异常,因为我不能使用逗号(或空格)作为元素名称的一部分。

但是

a)如果没有使用其中一个预定义的天数,我需要按照特定的顺序(周一,周二,周三,周四,周五,周六,周日)编写元素(由模式给出)(参见c)下面)。我已经让自己变得更难了,因为我已经反过来定义它们,周一是高位,但这是因为我先处理的旧数据格式将日期表示为标记(1/0)按顺序的字符串,例如星期一和星期二是&#34; 1100000&#34; (星期一左,星期日右);

b)我希望能够输出相应的元素,而无需单独测试所有内容(尽管如果必须的话,我想我必须这样做);和

c)我正在寻找的输出XML格式由带有XSD的标准规定,我无法改变它。

有什么好主意吗?

1 个答案:

答案 0 :(得分:0)

以下内容可能符合您的需求 它解析标志的输出字符串,并确定内容应该是XElement还是列表。

public static object GetDaysOfWeekXelementContent(DaysOfWeek pf)
{
    var pfStr = pf.ToString();
    if (pfStr.Contains(","))
    {
        return pfStr.Split(',').Select(x => new XElement(x.Trim()));
    }
    else
    {
        return new XElement(pfStr);
    }
}

static void Main(string[] args)
{
    List<DaysOfWeek> profiles = new List<DaysOfWeek>();
    profiles.Add(DaysOfWeek.MondayToFriday);
    profiles.Add(DaysOfWeek.MondayToSaturday);
    profiles.Add(DaysOfWeek.Monday | DaysOfWeek.Tuesday);

    XElement xml = new XElement("Profiles",
                        from DaysOfWeek pf in profiles
                        select new XElement("Profile", GetDaysOfWeekXelementContent(pf))
                    );
    Console.WriteLine(xml);
}

编辑关于值的排序,您可以从星期日到星期一声明值。您可以逐个解析值,将它们降序排序,以便在星期一到星期日。
以下应该做:

public static object GetDaysOfWeekXelementContent(DaysOfWeek pf)
{
    var pfStr = pf.ToString();
    if (pfStr.Contains(","))
    {
        return pfStr.Split(',').Reverse().Select(x => new XElement(x.Trim()));
    }
    else
    {
        return new XElement(pfStr);
    }
}