2011-08-02 14 views
19

tengo una clase simple como tales:Reflexión (?) - ¿Buscar nulo o vacío para cada propiedad/campo en una clase?

public class FilterParams 
{ 
    public string MeetingId { get; set; } 
    public int? ClientId { get; set; } 
    public string CustNum { get; set; } 
    public int AttendedAsFavor { get; set; } 
    public int Rating { get; set; } 
    public string Comments { get; set; } 
    public int Delete { get; set; } 
} 

¿Cómo verifico para cada uno de los bienes en la clase, si no son nulos (int) o vacío/null (por cadena), entonces yo' ¿Convertirá y agregará el valor de esa propiedad a List<string>?

Gracias.

Respuesta

30

Puede utilizar LINQ to hazlo:

List<string> values 
    = typeof(FilterParams).GetProperties() 
          .Select(prop => prop.GetValue(yourObject, null)) 
          .Where(val => val != null) 
          .Select(val => val.ToString()) 
          .Where(str => str.Length > 0) 
          .ToList(); 
+0

¿'prop.GetValue' devuelve' null' si la propiedad es de tipo 'int' y value' 0'? – dtb

+0

@dtb, no, devolvería '0' en ese caso. –

+0

@Frederic: ¿quieres incluir los 0 o filtrarlos? –

5

No es el mejor enfoque, pero más o menos:

Suponiendo obj es la instancia de su clase:

Type type = typeof(FilterParams); 


foreach(PropertyInfo pi in type.GetProperties()) 
{ 
    object value = pi.GetValue(obj, null); 

    if(value != null || !string.IsNullOrEmpty(value.ToString())) 
    // do something 
} 
0

He aquí un ejemplo:

foreach (PropertyInfo item in typeof(FilterParams).GetProperties()) { 
    if (item != null && !String.IsNullOrEmpty(item.ToString()) { 
     //add to list, etc 
    } 
} 
+0

Tienes razón, he corregido el fragmento. –

1
PropertyInfo[] properties = typeof(FilterParams).GetProperties(); 
foreach(PropertyInfo property in properties) 
{ 
    object value = property.GetValue(SomeFilterParamsInstance, null); 
    // preform checks on value and etc. here.. 
} 
0

¿Realmente necesita una reflexión? ¿Implementando una propiedad como bool IsNull es un caso para usted? Puedes encapsularlo en una interfaz como INullableEntity e implementarlo en cada clase que necesite dicha funcionalidad, obviamente si hay muchas clases quizás tengas que quedarte con la reflexión.

2

Si usted no tiene una gran cantidad de este tipo de clases y no demasiado muchas propiedades, la solución más sencilla es probablemente para escribir un iterator block que comprueba y convierte cada propiedad:

public class FilterParams 
{ 
    // ... 

    public IEnumerable<string> GetValues() 
    { 
     if (MeetingId != null) yield return MeetingId; 
     if (ClientId.HasValue) yield return ClientId.Value.ToString(); 
     // ... 
     if (Rating != 0)  yield return Rating.ToString(); 
     // ... 
    } 
} 

Uso:

FilterParams filterParams = ... 

List<string> values = filterParams.GetValues().ToList(); 
+0

¡Gran idea! Gracias. – Saxman

Cuestiones relacionadas