C#列挙にカスタムプロパティを追加

3545 ワード

通常、特定の値のセットを定義する必要があります.列挙を採用したほうがいい.固定された値のセットを直感的に管理するのに便利です.列挙値を出力する中国語の意味や色のスタイルなどに対応する必要がある場合は、次のように実現できます.

まず列挙クラスを定義します

enum @enum
{
    Update = 1,
    Insert = 2
}

方式一(if文)

if (@enum == 1)
{
    Console.Write("  ");
}
else (@enum == 2){
    Console.Write("  ");
}

方式二(switch文)

switch(@enum)
{
    case 1:
        Console.Write("  ");
        break;
    case 2:
        Console.Write("  ");
        break;
}

方式三(辞書を採用)

Dictionary dic = new Dictionary
{
    [1] = "  ",
    [2] = "  "
};
Console.Write(dic[@enum]);

より優雅な方法で実現し、列挙に特性を加えます。


システムでComponentModelネーミングスペースには、プロパティまたはイベントの説明を指定するプロパティDescriptionがあります.
enum @enum
{
    [Description("  ")]
    Update = 1,
    [Description("  ")]
    Insert = 2
}

多重化されたDescriptionの値を反射的に読み出すDescriptionの特性を取得するための拡張子を書くことができます

/// 
///      (DescriptionAttribute)    ;        ,        。       。
/// 
/// 
///    
/// 
public static string Description(this Enum @enum, string def = "")
{
    Type enumType = @enum.GetType();
    int value = int.Parse(Enum.Format(enumType, Enum.Parse(enumType, @enum.ToString()), "d"));
    FieldInfo fieldInfo = enumType.GetField(Enum.GetName(enumType, value));
    if (fieldInfo.GetCustomAttribute(typeof(DescriptionAttribute), false) is DescriptionAttribute descriptionAttribute)
    {
        return descriptionAttribute.Description;
    }
    return def != "" ? def : @enum.ToString();
}

では、使用時に列挙値に対応する記述情報を容易に取得できます.
@enum.Update.Description();

このように使用するたびにこのコードだけで列挙値の記述情報を呼び出すことができるので、他に何か必要なものがあれば、例えば、この列挙値には代表色、スタイルなどHTMLをレンダリングするための属性が必要です.ここではカスタム特性を使用します.まず、カスタム特性について説明します.実は簡単です.新しいクラスを作成します.すべてのプロパティクラスはAttributeから継承する必要があります.コードは次のとおりです.
/// 
///        
/// 
public class ClassAttribute : Attribute
{
    /// 
    ///   
    /// 
    public string Class { get; set; }
    /// 
    ///   
    /// 
    /// 
    public ClassAttribute(string value)
    {
        Class = value;
    }
}

このようなカスタムプロパティが作成されると、呼び出しの方法はDescriptionと同じです.しかし、カスタムプロパティを追加するたびに、プロパティ値を呼び出す方法を確立する必要がある場合は、疲れていませんか.オブジェクト向けの3つの特性のパッケージを覚えておく必要があります.反射と汎用を用いた拡張をもう一つ書きます.
/// 
///         
/// 
/// 
/// 
///    
/// 
public static String GetAttribute(this Enum @enum, String def = "") where T : Attribute
{
    Type type = @enum.GetType();
    MemberInfo[] memInfo = type.GetMember(@enum.ToString());
    object[] attributes = memInfo[0].GetCustomAttributes(typeof(T), false);
    return (attributes.Length > 0) ? attributes[0].ToString() : def;
}

列挙を変更する必要があります
enum @enum
{
    [Description("  "),Class("className")]
    Update = 1,
    [Description("  "),Class("className")]
    Insert = 2
}

使用すると、カスタムプロパティの値を簡単に取得できます.
@enum.Update.GetAttribute();

使用するときは参照関係に注意してください.使用するときは実際のニーズに合わせて調整します.