1

这是我在 Delphi 时代的遗留问题,我能够做以下事情:

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

但这似乎无法编译。

4

3 回答 3

3

你应该Dictionary<key, value>使用

var myArray = new Dictionary<ReportFileGeneratorFileType, string>();
myArray[ReportFileGeneratorFileType.Excel] = "application/vnd.ms-excel";
于 2013-06-04T07:37:49.377 回答
2

您可以在枚举值上使用属性(自定义或内置整数,例如 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;
...

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

于 2013-06-04T07:39:26.547 回答
1

c#你可以使用Attributes,使用这个命名空间

using System.ComponentModel;

您可以将Description属性添加到您的枚举元素

public enum ReportFileGeneratorFileType
{
    [Description("application/vnd.ms-excel")]
    Excel,
    [Description("application/pdf")]
    Pdf,
    [Description("application/vnd.ms-word")]
    Word
}

并且使用这些方法Dictionary<ReportFileGeneratorFileType, string>,您可以从枚举中“提取” a并将其用于您的代码。

于 2013-06-04T07:48:31.617 回答