2009-11-09 30 views
6

Me pregunto si C# admite propiedades opcionales como los siguientesC# propiedades opcionales en C# 3.0 (2009)

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

de manera que cuando se crea un objeto Person puedo comprobar fácilmente la validez de los valores de entrada de una forma sencilla bucle

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

He buscado en google pero no he encontrado la solución deseada. ¿Realmente tengo que entregar manualmente el código de validación de cada propiedad?

Gracias.

+3

creo que es una manera horrible de realizar la validación objeto. Huele ... –

+0

Pensé que esta era la mejor manera :(... Puedo guardar alrededor de 100 líneas de código repetitivo usando este enfoque. Aunque estoy de acuerdo en que el rendimiento puede doler un poco al usar la reflexión. –

+2

¿Te importa? para elaborar sobre el olor? –

Respuesta

22

Se puede decorar estas propiedades con el atributo definir y marcar las propiedades como opcional.

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

También es posible que desee echar un vistazo a Validation Application Block que tiene capacidades similares fuera de la caja.

+0

Esto es rápido, exactamente lo que estoy buscando. Muchas gracias. –

2

C# no tiene una palabra clave 'opcional', y como dice @Mitch de trigo, que es una manera horrible de realizar la validación.

Por qué no puedes simplemente hacer la validación en las propiedades de la moda?

+0

Porque no importa qué tipo de validación puse en setter. No podría verificar los datos si no se llama a setter :) –

0

si desea etiquetar los apoyos con atributos y no rodar su propio código de validación, por qué no probar un marco de validación?

http://www.codeplex.com/ValidationFramework

+0

Porque un marco para mi pequeña tarea parece ser un poco exagerado. Lo verificaré cuando tenga tiempo. Gracias por el aporte. –

Cuestiones relacionadas