Как использовать перечисления в качестве XName

Я хочу создать новый XElement или же XAttribute используя enum который хранит значения. Конструктор обоих классов ожидает XName как name а также object как content, Это означает, что я могу передать перечисление как content но мне нужно использовать ToString() использовать его в name, Обратите внимание, что XName имеет неявный оператор для string,

Это работает:

new XElement(HttpStatusCode.Accepted.ToString(), (int)HttpStatusCode.Accepted)
new XElement(HttpStatusCode.Accepted.ToString(), HttpStatusCode.Accepted)

Это не работает:

new XElement(HttpStatusCode.Accepted, (int)HttpStatusCode.Accepted)

Любые предложения, как enum может быть для установки имени XElement?

Благодарю.

2 ответа

Перечисления не являются неявно конвертируемыми в строки.

C# в настоящее время также не имеет возможности определять операторы расширений.

Метод расширения может упростить это:

public static class EnumXmlExtensions
{
    public static XElement EncodeXElement(this Enum @enum)
    {
        return new XElement(@enum.ToString());
    }
}

Использование:

HttpStatusCode.Accepted.EncodeXElement(); // <Accepted />

Смотрите также:

Перегрузка операторов методами расширения C#

Одно из решений, которое я могу придумать, - это создание служебного метода, который будет принимать объект и преобразовывать его в XName и создаст соответствующий элемент / атрибут. Что-то вроде:

    private static XElement NewElement(Enum name, params object[] content)
    {
        if (name == null)
        {
            throw new ArgumentNullException("name");
        }

        return new XElement(name.ToString(), content);
    }
Другие вопросы по тегам