24

列挙型で Description 属性を使用して、列挙型フィールドにわかりやすい名前を付けています。例えば

public enum InstallationType
{
    [Description("Forward of Bulk Head")]
    FORWARD = 0,

    [Description("Rear of Bulk Head")]
    REAR = 1,

    [Description("Roof Mounted")]
    ROOF = 2,
}

これにアクセスするには、便利なヘルパー メソッドを使用すると簡単です。

public static string GetDescriptionFromEnumValue(Enum value)
    {
        DescriptionAttribute attribute = value.GetType()
            .GetField(value.ToString())
            .GetCustomAttributes(typeof(DescriptionAttribute), false)
            .SingleOrDefault() as DescriptionAttribute;
        return attribute == null ? value.ToString() : attribute.Description;
    }

これをポータブル クラス ライブラリに変換する必要がありますが、System.ComponentModel ライブラリにアクセスできないようです。敬意を追加しようとすると、VSは私がすでにすべてを参照していることを教えてくれます。

ありがとう

4

3 に答える 3

28

はポータブル クラス ライブラリでは使用できないためDescriptionAttribute、別の属性を使用する必要があります。System.ComponentModel.DataAnnotationsポータブル クラス ライブラリで使用できる名前空間は、代わりに使用できる属性DisplayAttributeを提供します。

public enum InstallationType
{
    [Display(Description="Forward of Bulk Head")]
    FORWARD = 0,

    [Display(Description="Rear of Bulk Head")]
    REAR = 1,

    [Display(Description="Roof Mounted")]
    ROOF = 2,
}

メソッドを次のように変更する必要があります

public static string GetDescriptionFromEnumValue(Enum value)
    {
        DisplayAttribute attribute = value.GetType()
            .GetField(value.ToString())
            .GetCustomAttributes(typeof(DisplayAttribute ), false)
            .SingleOrDefault() as DisplayAttribute ;
        return attribute == null ? value.ToString() : attribute.Description;
    }
于 2013-09-20T09:15:25.187 に答える
16

ポータブル クラス ライブラリで何かを利用できるかどうかは、ライブラリ用に選択したフレームワークによって少し異なります。厳密な交差のみが得られます。ただし、この属性が対象のフレームワークの 1 つに存在しない可能性があります。その場合、1 つのオプションは独自のものを追加することです。そうすれば、それが利用可能であることがわかります。例えば:

[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
public class EnumDescriptionAttribute :Attribute
{
    private readonly string description;
    public string Description { get { return description; } }
    public EnumDescriptionAttribute(string description)
    {
        this.description = description;
    }
}

enum Foo
{
    [EnumDescription("abc")]
    A,
    [EnumDescription("def")]
    B
}

ここでは意図的に追加のシリアライゼーション コンストラクターを含めていないことに注意してください。これらもすべてのフレームワークで利用できるわけではない機能に依存するためです。コードを[Description]/DescriptionAttributeから[EnumDescription]/に変更するのEnumDescriptionAttributeは簡単です。

于 2013-09-20T09:15:27.020 に答える