Подтвердить что ты не робот

Добавление конструктора (или функции) в перечисление

Я не уверен, что конструктор именно то, что я ищу, но если я объясню, что я пытаюсь сделать, надеюсь, кто-то может сказать мне, пытаюсь ли я сделать это глупо, или есть ли способы сделать это.

Итак, у меня есть перечисление:

public enum MessageType
{
    Normal, 
    Error, 
    Chat, 
    Groupchat, 
    Headline
}

Это перечисление в основном является оберткой для jabber.net MessageType. Поэтому я хочу создать свое перечисление из этого. Поэтому в данный момент у меня есть такая функция:

private MessageType ConvertMessageType(JabberMessageType jabberType)
{
    MessageType type = MessageType.Error;

    switch (jabberType)
    {
        case JabberMessageType.normal:
            type = MessageType.Normal;
            break;

        //etc
    }

    return type;
}

Поэтому я должен использовать enum MessageType type = ConvertMessageType(JabberMessageType.groupchat);

Мне бы хотелось, чтобы я мог сделать что-то вроде:

enum MessageType type = MessageType(JabberMessageType.groupchat);
// or 
enum MessageType type = MessageType.FromJabberJid(JabberMessageType.groupchat);

Итак, преобразование относится к перечислению, а не к выходу метода.

4b9b3361

Ответ 1

Почему бы не создать метод расширения, чтобы сделать это для вас?

public static class ExtensionMethods
{
    public static MessageType ConvertMessageType(this JabberMessageType jabberType)
    {
        switch(jabberType)
        {
            case JabberMessageType.normal:
                return MessageType.Normal;
            // Add rest of types here.
            default:
                return MessageType.Error;
        }
    }
}

Пример использования:

var type = JabberMessageType.normal; // JabberMessageType
var messageType = type.ConvertMessageType(); // Converted to your custom MessageType

Ответ 2

Вы не можете этого сделать. Тип перечисления переводит на int (или byte, sbyte, short, uint, long или ulong если указано) и технически не class.

Тип перечисления (также называемый перечислением или перечислением) предоставляет эффективный способ определения набора именованных интегральных констант, которые могут быть назначается переменной.

Одним из решений было бы поставить статический метод для этого в классе Utilities.

MessageType type = Utilities.MessageTypeFromJabberJid(JabberMessageType.groupchat);

Ответ 3

Как насчет класса, в котором находится ваш enum? Что-то вроде этого

public static class Message
{
    public enum Types
    {

    }

    public static Message.Types ConvertMessageType(Message.Types jabberType)
    {
    }
}

Ответ 4

Вы можете написать простой однострочный вкладыш, который в будущем нуждается в меньшей настройке (в случае добавления дополнительных значений перечисления), но это предполагает, что имена перечислений в обоих типах одинаковы:

private MessageType ToMessageType(this JabberMessageType jabberType)
{
    return Enum.Parse(typeof(MessageType), jabberType.ToString(), true);
}

Это некоторая функция отображения, от одного типа к другому.