2012-04-06 4 views
0

Überprüfen Sie, ob ich ein customAttribute namens ResponseAttributes habe. Ich habe eine Schnittstelle und mehrere konkrete Klassen deklariert { Question 1, Question2, Question3 }Wie ermittelt man, ob ein customAttribute aus einer Klasse gleich ist?

[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"; } 
} 

Nun, was ich versuche zu tun, wie eine Klasse, um zu überprüfen, die enthält das Attribut ist zu einem anderen gleich?

ich meine:

 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 
     } 

Wie Sie können, sie unterschiedliche Typen sind, das ist der Grund, warum ich als ResponseAttribute gesetzt.

+1

Warum brauchen Sie überhaupt ein Attribut? Wenn Ihre Schnittstelle eine Response-Eigenschaft enthält (z. B. decimal Response {get; set;}), können Sie Ihre Variablen über die gemeinsame Eigenschaft – kristian

+0

vergleichen. Das Problem hier ist, dass jede Frage eine Response-Eigenschaft hat, die jedoch unterschiedlich ist datatype, also dachte ich, dass das customAttribute –

+0

gut ist Einer der Vorteile der Verwendung einer Schnittstelle IQuestion ist, dass Sie die Verwendung eines vergleichbaren Standarddatentyps für einige Ausgaben erzwingen können. Sie möchten vielleicht nicht ändern, wie Response funktioniert (unterschiedliche Datentypen beibehalten), aber Sie können eine Interface-Eigenschaft "Answer" als String hinzufügen, der bei der Implementierung die Response als String zum Vergleich ausgibt. Dann wird dein for-each trivial, wenn FrageA.Answer == questionB.Answer ... ' – EtherDragon

Antwort

1

Sie könnten versuchen, eine Schnittstelle, mit Resposnse Eigenschaft (Typ-Objekt) , wenn Sie nicht können, Sie eine Klasse-Ebene verwenden könnten Attribut, dass Sie die „Antwort Eigenschaft“ sagen, als Sie Reflexion über diese Eigenschaft

Beispiel verwenden können:


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); 
} 
 
+0

Bitte, können Sie mehr über die zweite Option erklären? –

+0

bearbeitet post .. hoffe es hilft dir –

0

Versuch überwiegende gleich Methode:

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

hoffte, das hilft

Verwandte Themen