2009-11-09 10 views
6

zastanawiam się czy C# obsługuje właściwości opcjonalnych jak następującejC# Opcjonalne właściwości w C# 3.0 (2009)

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

tak, że kiedy utworzyć obiekt osoba może łatwo sprawdzić ważność wartości wejściowych w prosty pętla

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

Szukałem w Google, ale nie otrzymałem pożądanego rozwiązania. Czy naprawdę muszę ręcznie przekazać kod sprawdzania poprawności dla każdej właściwości?

Dzięki.

+3

myślę, że jest to straszny sposób sprawdzania poprawności obiektów. Pachnie ... –

+0

Pomyślałem, że to najlepsza metoda :(... mogę zapisać około 100 linii powtarzalnego kodu za pomocą tego podejścia, mimo że zgadzam się, że wydajność trochę zaszkodzi, używając refleksji –

+2

Czy ci zależy? do opracowania zapachu? –

Odpowiedz

22

Możesz dekorować te właściwości za pomocą zdefiniowanego atrybutu i oznaczyć właściwości jako opcjonalne.

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

Można też spojrzeć na Validation Application Block który ma podobne możliwości out of the box.

+0

To jest szybkie, dokładnie to, czego szukam. Dziękuję Ci bardzo. –

2

C# nie ma "opcjonalnego" słowa kluczowego, a jak mówi @Mitch Wheat, jest to okropny sposób na sprawdzenie poprawności.

Dlaczego nie można po prostu wykonać sprawdzania poprawności w ustawieniach właściwości?

+0

Ponieważ bez względu na to, jaki rodzaj sprawdzania poprawności wprowadziłem w ustawieniu. Nie byłbym w stanie zweryfikować danych, jeśli seter nie jest w ogóle wywoływany :) –

0

jeśli chcesz oznaczyć rekwizyty atrybutami, a nie wstawić własnego kodu weryfikacyjnego, może warto wypróbować framework sprawdzania poprawności?

http://www.codeplex.com/ValidationFramework

+0

Ponieważ struktura mojego małego zadania wydaje się być nieco przesadna. Sprawdzę to, kiedy dostanę czas. Dzięki za wejście. –

Powiązane problemy