2011-08-05 178 views
1

我需要我的枚举返回一个特定的字符串,但我不能解决如何使它返回一个字符串中断而没有一个方法来执行转换。如果没有辅助方法,是否可以使LicenseTypes.DISCOUNT_EARLY_ADOPTER返回DISCOUNT EARLY-ADOPTERC#枚举返回字符串中断

// 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"; 
} 
+0

你怎么用断线意思? – BoltClock

+0

@Bolt,我的意思是它返回字符串“DISCOUNT EARLY-ADOPTER”,它有空格,枚举不像空格,所以我必须强调它们。 –

+0

他意味着空间。 – psr

回答

8

首先,从辅助方法,一个单独的选项很简单,就是有你填充一次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" }, 
}; 

(正如在评论中指出,另一种选择是开关/箱...但我个人比较喜欢这种方式,有效地你已经有了一个数据映射,所以是有意义的使用数据结构,而不是一个执行流程结构。这也意味着你可以换出不同语言的词典等,如果你想。)

其次,一个选择是是装饰每个枚举值与[Description]属性(或您自己的贡如果你想),并发现了与反思 - Unconstrained Melody有一个扩展方法可以做到这一点很容易:

// 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 
} 
+0

谢谢乔恩!很好的答案,我还在另一周购买了你的书,并准备开始接受它,看起来很棒! –

+0

+1:我喜欢你为数据映射使用数据结构的观点。 –

+1

@Tom:酷 - 希望你喜欢这本书。如果任何事情没有意义,请给我打电话:) –

1

虽然它没有消除辅助方法,注意,你的情况可能,你不能开始使用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(); 
} 
2

一点点反思,属性魔法,这应该只是回答吧:)
Getting attributes of Enum's value

也可能使一个extension method

这里是它应该是什么样子(还增加了仿制药):

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 
} 

谢谢你,伙计们说写这些:

祝你好运!

0

转换为字符串使用“G”的格式,然后用空格代替“_”(下划线):

LicensceTypes license = LicenseTypes.COMMERCIAL_EARLY_ADOPTERS; 
string licenseDescription = license.ToString("G").Replace('_', ' '); 
// licenseDescription = "COMMERCIAL EARLY ADOPTERS" 
+0

感谢您的回答,但如果我们在未来添加其他许可证,并且下划线等问题很难维护! –

+0

虽然这留下了OP的期望连字符('-')。 –

0

我想我会用一个类来避免这种情况。:/

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"); 
} 
1

我用这个来自谷歌的dotnet的客户端 - StringValueAttribute.csUtilities.cs

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

然后,你可以简单地这样做:

licenseType.GetStringValue();