2016-12-21 10 views
1

...enumのカスタムDisplayAttributeを作成しますか?もちろん私は、列挙型クラスを持っている

public enum LeadStatus : byte 
{ 
    [Display(Name = "Created")] Created = 1, 
    [Display(Name = "Assigned")] Assigned = 2, 
    .... 
} 

Nameは、アウト・オブ・ボックスです。メタデータから...

namespace System.ComponentModel.DataAnnotations 
{ 
    public sealed class DisplayAttribute : Attribute 
    { 
     ... 
     public string Name { get; set; } 
     ... 
    } 
} 

は私はちょっと周りを踊るここではいくつかの他のスレッドを見てきました

[Display(Name = "Created", BackgroundColor="green")] Created = 1 

...など「BackgroundColorを」など独自のカスタムディスプレイの帰属を、望んでいたと仮定します私はそれを動作させることができないほどコンテキストが異なっています。私は何らかのエクステンション/オーバーライドクラスを作成する必要があると思っていますが、私はこれを私の頭に描いていません。

ありがとうございます!

+0

作成する属性は簡単です。カスタムクラスをAttributeから継承するだけです。後で列挙型メンバーから属性情報を抽出できます。 –

+0

私は許してください...しかし、 "簡単"は、異なる人々のために異なることを意味するかもしれません! –

+0

ちょっとお返事をもう一度見て、ペーストをコピーしてください。それが動作します。元の 'DisplayAttribute'を隠して自分自身を使用したいので、名前空間が重要であることに注意してください。 –

答えて

3

独自の属性があります。

public sealed class ExtrasDisplayAttribute : Attribute 
{ 
    public string Name { get; set; } 
    public string BackgroundColor { get; set; } 
} 

そしてこの拡張メソッド。

namespace ExtensionsNamespace 
{ 
    public static class Extensions 
    { 
     public static TAttribute GetAttribute<TAttribute>(Enum value) where TAttribute : Attribute 
     { 
      return value.GetType() 
       .GetMember(value.ToString())[0] 
       .GetCustomAttribute<TAttribute>(); 
     } 
    } 
} 

これで、このようにenumから属性を抽出できます。

using static ExtensionsNamespace.Extensions; 

//... 

var info = GetAttribute<ExtrasDisplayAttribute>(LeadStatus.Created); 
var name = info.Name; 
var bg = info.BackgroundColor; 

//... 

public enum LeadStatus : byte 
{ 
    [ExtrasDisplay(Name = "Created", BackgroundColor = "Red")] Created = 1, 
    [ExtrasDisplay(Name = "Assigned")] Assigned = 2, 
} 

元の属性をそのまま使用したい場合は、その属性も使用できます。 両方の属性を単一の列挙型に適用する必要があります。

public enum LeadStatus : byte 
{ 
    [Display(Name = "Created"), ExtrasDisplay(BackgroundColor = "Red")]Created = 1, 
    [Display(Name = "Assigned")] Assigned = 2, 
} 

それぞれを抽出します。

var name = GetAttribute<DisplayAttribute>(LeadStatus.Created).Name; 
var bg = GetAttribute<ExtrasDisplayAttribute>(LeadStatus.Created).BackgroundColor; 
+0

ok!ありがとう!私は実装しています。すぐに戻って。 –

+0

ここに何らかのトラブルがあります。背景色が認識されません。 "タイプまたは名前空間BackgroundColorが見つかりません。"enumのプロパティのDisplay Attributeとして使用しようとしたときに取得する –

+0

私のコード/プロジェクトでは、2番目のコードブロックに拡張メソッドを置くのですか? –

2

public sealed class DisplayAttribute : Attribute密閉されたクラスであるため、あなたはそれを継承し、それを他の行動やプロパティを追加することはできません。以下は

私の仮定であるが、彼らはなぜ

を知っていて、.NET開発者は、それが密閉され作られたなぜあなたは不思議に思う可能性がある場合、誰かがチャイムができますか?私はDisplayAttributeのプロパティのそれぞれがjavascript、htmlなどを挿入するために使用されるため、同じことが考えられます。BackgroundColorプロパティを追加した場合、その意味は何ですか? UIで何ができますか?

+0

これはできないと言っていますか?もしそうなら、何らかの回避策がありますか? –

+0

この属性を継承または上書きする必要はありません。単にあなた自身の属性を書くことができます。私の答えはうまくいく。 –

+0

私はそれが動作するようになっていません。あなたの答えで私のコメントで言ったように、 "BackgroundColor"は認識されません。 –

0

このことは不可能であると結論づけて、私は別の種類の解決策を検討しました。もともと私が望んでいたほど整ったものではありませんが、それでも仕事は終わります。

Methods inside enum in C#

関連する問題