由C#中的枚举“下标”的字符串数组

时间:2013-06-04 07:35:27

标签: c#

这是我德尔菲时代的遗留问题,我可以做以下事情:

  type
   TCars  = (Ford, Nissan, Toyota, Honda);     
  const
      CAR_MODELS = array[TCars] of string = ('Falcon','Sentra','Camry','Civic');

允许我声明性地使用一些相关数据进行枚举。在这种情况下,一个字符串,但它可能是一个记录结构或类似物。这意味着如果我将一个成员添加到TCars并忘记更新CAR_MODELS数组,我将收到编译时错误。

这是什么C#方法?我试过了:

public enum ReportFileGeneratorFileType
{
    Excel,
    Pdf,
    Word
}

string[ReportFileGeneratorFileType] myArray = {"application/vnd.ms-excel", "application/pdf", "application/vnd.ms-word"};

但似乎没有编译。

3 个答案:

答案 0 :(得分:3)

您应该使用Dictionary<key, value>作为

var myArray = new Dictionary<ReportFileGeneratorFileType, string>();
myArray[ReportFileGeneratorFileType.Excel] = "application/vnd.ms-excel";

答案 1 :(得分:2)

您可以在枚举值上使用属性(自定义或内置int,例如DisplayNameAttribute)来为它们提供关联的名称/值。示例自定义属性如下:

public class ContentTypeAttribute : Attribute
{
    public string ContentType { get; set; }
    public ContentTypeAttribute(string contentType) 
    { 
         ContentType = contentType;
    }
}

public enum ReportFileGeneratorFileType
{
    [ContentType("application/vnd.ms-excel")]
    Excel,

    [ContentType("application/pdf")]
    Pdf,

    [ContentType("application/vnd.ms-word")]
    Word
}

要根据枚举值检索内容类型,请使用:

...
ReportFileGeneratorFileType myType = ...
string contentType = myType.GetType()
    .GetCustomAttributes(typeof(ContentTypeAttribute))
    .Cast<ContentTypeAttribute>()
    .Single()
    .ContentType;
...

这可能看起来有点复杂,但是让你可以在枚举本身上保留内容类型(或任何数据),这样你就不会忘记在添加新类型后添加它。

答案 2 :(得分:1)

使用此命名空间c# using System.ComponentModel; {/ 1}}

Description

您可以将public enum ReportFileGeneratorFileType { [Description("application/vnd.ms-excel")] Excel, [Description("application/pdf")] Pdf, [Description("application/vnd.ms-word")] Word } 属性添加到枚举元素

Dictionary<ReportFileGeneratorFileType, string>

use Attributes您可以从枚举中“提取”{{1}}并在代码中使用它。