2012-04-06 6 views
0

ResponseAttributesというcustomAttributeがあることを確認してください。私は私がやろうとしていることは別のものに等しい属性であることを含むクラスを確認する方法で、インタフェースおよびいくつかの具体的なクラス今{ Question 1, Question2, Question3 }クラスのcustomAttributeが他のクラスと等しいかどうかを調べる方法は?

[AttributeUsage(AttributeTargets.Property)] 
public class ResponseAttribute : Attribute { } 
public interface IQuestion { } 

public class Question1 : IQuestion 
{ 
    [Response] 
    public string Response { get; set; } 
    public Question1() { Response = "2+1"; } 
} 

public class Question2 : IQuestion 
{ 
    [Response] 
    public decimal Response { get; set; } 
    public Question2() { Response = 5; } 
} 

public class Question3 : IQuestion 
{ 
    [Response] 
    public string Response { get; set; } 
    public Question3() { Response = "2+1"; } 
} 

を宣言していますか?

私は意味:

 List<IQuestion> questions = new List<IQuestion>() 
     { 
      new Question1(), new Question2() 
     }; 

     Question3 question3 = new Question3(); 

     foreach (var question in questions) 
     { 
      // how to verify this condition: 
      // if (customAttribute from question3 is equals to customAttribute fromquestion) 
      // of course the question3 is equals to 1 
     } 

することができますように、彼らはさまざまな種類が、それは私がResponseAttributeとして設定した理由です。これは、あなたが、あなたはクラスレベルを使用することができないことができれば、あなたがResposnseプロパティ(型オブジェクト)と、インタフェースを使用して を試みることができる

+1

なぜ属性が必要なのですか?インターフェイスにResponseプロパティが含まれている場合(つまり、10進レスポンス{get; set;})、インターフェイスによって提供される共通プロパティを通じて変数を比較することができます – kristian

+0

ここでの問題は、すべての質問に応答プロパティがありますが、私はそれがcustomAttributeを持つことが良いと思っていた –

+0

インターフェイスを使用する利点の1つIQuestionは、いくつかの出力に標準の比較可能なデータ型の使用を強制することができます。 Responseがどのように動作するか(異なるデータ型を保持する)を変更したくないかもしれませんが、実装時にレスポンスを比較用の文字列として出力する文字列としてインタフェースプロパティ 'Answer'を追加することを検討するかもしれません。あなたのためにあなたのfor-eachは、 'questionA.Answer == questionB.Answer ...' – EtherDragon

答えて

1

役立ちます

public override bool Equals(object obj) 
    { 
     if (obj is IQuestion) 
      return this.Response == ((IQuestion)obj).Response; 
     else 
      return base.Equals(obj); 
    } 

希望:

+0

の場合は、簡単になります。第2のオプションについてもっと詳しく説明できますか? –

+0

編集された投稿..あなたのお役に立てば幸いです –

0

トライオーバーライドは、equalsメソッドをあなたはその性質上

例をリフレクションを使用することができ、よりあなたの「応答性」を伝える属性:


public class ResponseAttribute : Attribute { 
    public string PropertyName { get; set } 
} 

[ResponseAttribute ("CustomResponse")} 
public class Question1 { 
    public string CustomResponse; 
} 

via reflection 
foreach(var question in questions) { 
    var responseAttr = (ResponseAttribute) question.GetType().GetCustomAttributes(typeof(ResponseAttribute)); 

var questionResponse= question.GetType().GetProperty(responseAttr.PropertyName,question,null); 
} 
 
関連する問題