C # Enum возвращает строку с разрывами - PullRequest
1 голос
/ 06 августа 2011

Мне нужно, чтобы мое перечисление возвращало определенную строку, но я не могу понять, как заставить его возвращать строку с разрывами в ней, не имея метода для преобразования. Можно ли сделать LicenseTypes.DISCOUNT_EARLY_ADOPTER return DISCOUNT EARLY-ADOPTER без вспомогательного метода?

// All license types
public enum LicenseTypes
{
    DISCOUNT,
    DISCOUNT_EARLY_ADOPTER,
    COMMERCIAL,
    COMMERCIAL_EARLY_ADOPTER
}

// Convert enum to correct string
public static string LicenseTypeToString(LicenseTypes Enum)
{
    if (Enum == LicenseTypes.COMMERCIAL)
        return "COMMERCIAL";
    else if (Enum == LicenseTypes.COMMERCIAL_EARLY_ADOPTER)
        return "COMMERCIAL EARLY-ADOPTER";
    else if (Enum == LicenseTypes.DISCOUNT)
        return "DISCOUNT";
    else if (Enum == LicenseTypes.DISCOUNT_EARLY_ADOPTER)
        return "DISCOUNT EARLY-ADOPTER";
    else
        return "ERROR";
}

Ответы [ 6 ]

8 голосов
/ 06 августа 2011

Во-первых, отдельная опция от вспомогательного метода - просто иметь Dictionary<LicenseTypes, string>, который вы заполняете один раз.Вероятно, это был бы самый простой подход, если честно:

private static readonly Dictionary<LicenseTypes, string> LicenseDesciptions =
    new Dictionary<LicenseTypes, string> 
{
    { LicenseTypes.COMMERCIAL, "COMMERCIAL" },
    { LicenseTypes.COMMERCIAL_EARLY_ADOPTER, "COMMERCIAL EARLY-ADOPTER" },
    { LicenseTypes.DOMESTIC, "DOMESTIC" },
    { LicenseTypes.DOMESTIC_EARLY_ADOPTER, "DOMESTIC EARLY-ADOPTER" },
};

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

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

// Throws ArgumentOutOfRangeException if the licenseType value isn't defined
// or doesn't have a description.
string description = licenseType.GetDescription();

Кроме того, в соответствии с соглашениями именования .NET он должен быть:

public enum LicenseType // Singular as it's not a Flags enum
{
    Discount,
    DiscountEarlyAdopter,
    Commercial,
    CommercialEarlyAdopter
}
2 голосов
/ 06 августа 2011

Небольшое отражение и магия атрибутов, и на это должен просто ответить:)
Получение атрибутов значения Enum

Может также сделать его методом расширения .

вот как это должно выглядеть (также добавлены обобщения):

public static class MyExtensionsClass
{
    public static string ToDescriptionString<T>(this T val)
        where T : struct, IConvertible
    {
        if (typeof(T).IsEnum) 
        {
           var type = val.GetType();
           var memInfo = type.GetMember(val.ToString());
           var attributes = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
           return ((DescriptionAttribute)attributes[0]).Description;
        }
        return ""; //all paths must return a value
    }
}

public enum LicenseTypes
{
    [Description("DISCOUNT")]
    DISCOUNT,
    [Description("DISCOUNT EARLY-ADOPTER")]
    DISCOUNT_EARLY_ADOPTER,
    [Description("COMMERCIAL")]
    COMMERCIAL,
    [Description("COMMERCIAL EARLY-ADOPTER")]
    COMMERCIAL_EARLY_ADOPTER
}

Спасибо, ребята, которые написали следующее:

Удачи!

1 голос
/ 06 августа 2011

Я использую это из дотнет-клиента Google - StringValueAttribute.cs и Utilities.cs

public enum LicenseType
{
     [StringValue("DISCOUNT")] Discount,
     [StringValue("DISCOUNT EARLY-ADOPTER")] DiscountEarlyAdopter,
     [StringValue("COMMERCIAL")] Commercial,
     [StringValue("COMMERCIAL EARLY-ADOPTER")] CommercialEarlyAdopter
}

Тогда вы можете просто сделать это:

licenseType.GetStringValue();
1 голос
/ 06 августа 2011

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

switch (Enum) {
    case LicenseTypes.COMMERCIAL_EARLY_ADOPTER:
        return "COMMERCIAL EARLY-ADOPTER";
    case LicenseTypes.DISCOUNT_EARLY_ADOPTER:
        return "DISCOUNT EARLY-ADOPTER";
    default
        return Enum.ToString();
}
0 голосов
/ 06 августа 2011

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

public class LicenceType
{
    private string name;
    public LicenceType(string Name)
    {
        this.name = Name;
    }
    public override string ToString()
    {
        return name;
    }
}

public static class LicenceTypes
{
    public static LicenceType DISCOUNT = new LicenceType("DISCOUNT");
    public static LicenceType DISCOUNT_EARLY_ADOPTER= new LicenceType("DISCOUNT EARLY-ADOPTER");
    public static LicenceType COMMERCIAL= new LicenceType("COMMERCIAL");
    public static LicenceType COMMERCIAL_EARLY_ADOPTER= new LicenceType("COMMERCIAL EARLY-ADOPTER");
}
0 голосов
/ 06 августа 2011

Преобразовать в строку, используя формат "G", затем заменить "_" (подчеркивание) пробелами:

LicensceTypes license = LicenseTypes.COMMERCIAL_EARLY_ADOPTERS;
string licenseDescription = license.ToString("G").Replace('_', ' ');
// licenseDescription = "COMMERCIAL EARLY ADOPTERS"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...