2009-11-09 11 views
6

Ich frage mich, ob C# optionale Eigenschaften wie die folgendenC# optionale Eigenschaften in C# 3.0 (2009)

public class Person 
{ 
    public string Name { get; set;} 
    public optional string NickName { get; set;} 
    ...many more properties... 
} 
unterstützt

so, dass wenn ich eine Person Objekt erstelle ich leicht die Gültigkeit der Eingangswerte in einem einfachen überprüfen Schleife

public bool IsInputOK(Person person) 
{ 
    foreach(var property in person.GetType().GetProperties()) 
    { 
     if(property.IsOptional()) 
     { 
      continue; 
     } 
     if(string.IsNullOrEmpty((string)property.GetValue(person,null))) 
     { 
      return false; 
     } 
    } 
    return true; 
} 

Ich habe auf Google gesucht, aber erwünschte Lösung nicht bekommen. Muss ich den Code für die Gültigkeitsprüfung für jede Property wirklich manuell übergeben?

Danke.

+3

Ich denke, dass eine schreckliche Art und Weise ist Gegenstand Validierung durchgeführt werden. Es riecht ... –

+0

Ich dachte, das wäre der beste Weg :(... Ich kann mit diesem Ansatz etwa 100 Zeilen repetitiven Code speichern. Auch wenn ich zustimme, dass die Leistung durch die Verwendung von Reflektion ein bisschen wehtut. –

+2

Interessiert mich? auf den Geruch zu erarbeiten? –

Antwort

22

Sie können diese Eigenschaften mit einem von Ihnen definierten Attribut dekorieren und die Eigenschaften als optional kennzeichnen.

[AttributeUsage(AttributeTargets.Property, 
       Inherited = false, 
       AllowMultiple = false)] 
internal sealed class OptionalAttribute : Attribute 
{ 
} 

public class Person 
{ 
    public string Name { get; set; } 

    [Optional] 
    public string NickName { get; set; } 
} 

public class Verifier 
{ 
    public bool IsInputOK(Person person) 
    { 
     foreach (var property in person.GetType().GetProperties()) 
     { 
      if (property.IsDefined(typeof(OptionalAttribute), true)) 
      { 
       continue; 
      } 
      if (string.IsNullOrEmpty((string)property.GetValue(person, null))) 
      { 
       return false; 
      } 
     } 
     return true; 
    } 
} 

Sie können auch einen Blick auf Validation Application Block nehmen wollen, die aus dem Kasten ähnliche Fähigkeiten hat.

+0

Das ist schnell, genau das, was ich suche. Vielen Dank. –

2

C# hat kein 'optionales' Schlüsselwort, und wie @Mitch Wheat sagt, ist es eine schreckliche Art, eine Validierung durchzuführen.

Warum können Sie nicht einfach die Validierung im Eigenschaftensetter durchführen?

+0

Denn egal welche Art von Validierung ich setze. Ich wäre nicht in der Lage, die Daten zu überprüfen, wenn Setter überhaupt nicht aufgerufen wird :) –

0

Wenn Sie die Requisiten mit Attributen versehen und keinen eigenen Validierungscode erstellen möchten, versuchen Sie es mit einem Validierungsframework.

http://www.codeplex.com/ValidationFramework

+0

Weil ein Framework für meine kleine Aufgabe scheint ein wenig zu übertreiben. Ich werde es überprüfen, wenn ich Zeit habe. Danke für die Eingabe. –