2016-10-11 5 views
-1

編集:の代わりにGuidを使用するように投稿を更新しました。以下の人々のおかげで、intを使用すると、enumの基本型がintであるため、何もしないことが指摘されています。2つの属性値のいずれかを使用してenum値を取得する方法

私はのは、この列挙型のように定義された動物の属性、使用することが

public enum AnimalType 
{ 
    [Animal("00000000000000000000000000000001")] 
    Bear = 0, 

    [Animal("00000000000000000000000000000002")] 
    Cat = 1, 

    [Animal("00000000000000000000000000000003")] 
    Dog = 2 
} 

だとしましょう、列挙型を持っている:受け入れるようにできるように、あなたはAnimalAttributeための2つのコンストラクタがある見ることができるように

public class AnimalAttribute : Attribute 
{ 
    public AnimalAttribute(Guid id) 
    { 
     this.AnimalId = id; 
    } 

    public AnimalAttribute(string id) 
    { 
     this.AnimalId = new Guid(id); 
    } 

    public Guid AnimalId { get; private set; } 

    // Some more properties 

} 

をidはstringまたはGuidです。 AnimalType enumはstringコンストラクタを使用します。

今のところ、enum値はidを知ることによってのみアクセスできます。特定のenum値に対応するidがわからない場合は、各enum値に対応する名前/説明を使用してenum値にアクセスすることもできます(おそらく、Bearの場合は「Bear」のみ)。私の質問は、AnimalAttributeがid(および文字列またはGuid)またはenum値に対応する名前/説明のいずれかを受け入れるように、これをどのように設定するのですか?私はそうのようなAnimalAttributeのための別のコンストラクタをしたいと思い:

public AnimalAttribute(string name) 
{ 
    this.AnimalName = name; // assume there is an AnimalName property. 
} 

その後、私はそうのような各列挙値に別の属性を追加することができます。

[Animal("00000000000000000000000000000001")] 
[Animal("Bear")] 
Bear = 0, 

だから、私はどちらかの値とI'LLを供給できます列挙型の値を取得することができます。これの問題は、AnimalAttributeでコンストラクタにstring nameを受け入れることができないことです。もう1つのコンストラクタがstring idを受け入れているためです。私はそれを行うことができない場合、私はオプションのパラメータでコンストラクタを作ることができると思った。これを設定する簡単な方法はありますか?

答えて

0

あなたのシナリオのいくつかの詳細を誤解していますが、Animal属性のAnimalIdプロパティが常にEnum要素のint値と等しい場合、Animal属性は不要ですか? int型の値は、単に列挙型をキャストしますするには

public enum AnimalType 
{ 
    Bear = 0, 
    Cat = 1, 
    Dog = 2 
} 

int animalVal = (int)AnimalType.Bear; 

値によって、動物の名前を取得するには:

列挙:あなただけの次の操作を行うことができませんでした

string animalName = Enum.GetName(typeof(AnimalType), 0); 
+0

はい、あなたは正しい、それは私のミスです。この例を作ったのは、私が実際に働いていることを与えたくないからです。私が実際に働いているIDはGUIDなので、それは必要なのです。より明確にするために、上記の答えに対する私のコメントを見てください。 – Drew

+0

@Drew私は、上記のコメントを明確にするために参考にしました。あなたは動物に対応するGUIDにアクセスできないので、動物名を含む記述属性で各列挙体を飾るだけでいいのですか?そうすれば列挙型を得ることができます。 – Dave

1

あなたの目標はわかりませんが、これを過度に複雑にしている可能性があります。 の値がの値を持つ列挙体を使用すると、の値がと異なる値を持つ属性を定義することは意味がありません。

代わりにDescriptionAttributeを使用してください。これは内蔵されており、必要なものを実行します。

チェックアウトGetting attributes of Enum's value

+0

私が実際にやっていることは、この例が実際には少し違うという点では、私は愚かではないかもしれません。 int idは実際にはGuidであるため、必要なのです。だから基本的に私の質問は、私はGuidまたは名前/説明属性の列挙型の値を取得したい - それは可能ですか?それは理にかなっていますか? – Drew

+0

** DescriptionAttribute **は引き続き動作します。あなたはguidは単なる文字列なので、その説明になることができます。私はあなたの最終目標に疑問を呈します。どうしてInterfaceやAbstract型のAnimalを代わりに持ち、そこにGuidを置いておきましょうか? –

+0

私はまだちょっと混乱していると思います。私が実際に働いていることのもう少しの背景が役立つかもしれません。私はXmlDocumentを解析しています。このドキュメントでは動物の名前にアクセスできます(Enum名に直接対応しないので、Enum.TryParseを使用できません)。私は動物に対応するGuidにアクセスできない。だから、たとえGuidが記述であっても、それはenum値を得るのを助けません。あなたの2番目の点については、私は与えられたコードを使って作業しています。私は他のものがそれに頼っているので、私はそれを変更したくないですが、私はそれに追加することができます。 – Drew

関連する問題