2012-08-01 11 views
5

Tengo List donde MyType: DynamicObject. La razón por la cual MyType hereda de DynamicObject es que necesito un tipo que puede contener un número desconocido de propiedades.Linq con DynamicObject

Todo funciona bien hasta que necesite filtrar la Lista. ¿Hay una manera que puedo hacer un LINQ que va a hacer algo como esto:

return all items where any of the properties is empty string or white space? 
+0

Existen otros tipos que pueden contener propiedades desconocidas, como 'ExpandoObject'. Su vida sería mucho más fácil si pudiera usar 'ExpandoObject' en lugar de' DynamicObject'. – dasblinkenlight

+0

Tendría que verificar si los controles de UI que estoy usando soportan ExpandoObject, pero si lo hacen, no tengo problemas para hacer la transición de DynamicObject a ExpandoObject. La pregunta es, ¿puedo hacer una consulta linq arriba con List ? – Goran

Respuesta

1

Bueno, siempre y cuando las propiedades de cada objeto no son desconocidos internamente a sí mismos que podrían hacerlo.

No es una gran manera genérica para probar todas las propiedades de un objeto dinámico, si usted no tiene control sobre el DynamicObject que espera el implementador implementado GetDynamicMemberNames() y puede utilizar métodos de la Nuget paquete de ImpromptuInterface para getting the property names y dynamically invoking those names.

return allItems.Where(x=> Impromptu.GetMemberNames(x, dynamicOnly:true) 
         .Any(y=>String.IsNullOrWhiteSpace(Impromptu.InvokeGet(x,y)); 

De lo contrario, ya que es su propio tipo MyType puede añadir su propio método que se puede ver la contabilidad interna de los valores de los miembros.

return allItems.Where(x => x.MyValues.Any(y=>String.IsNullOrWhitespace(x)); 
3

(desde el comentario) puede hacer yo por encima de consulta LINQ con la lista?

Sí, aquí es cómo puede hacerlo con ExpandoObject:

var list = new List<ExpandoObject>(); 
dynamic e1 = new ExpandoObject(); 
e1.a = null; 
e1.b = ""; 
dynamic e2 = new ExpandoObject(); 
e2.x = "xxx"; 
e2.y = 123; 
list.Add(e1); 
list.Add(e2); 
var res = list.Where(
    item => item.Any(p => p.Value == null || (p.Value is string && string.IsNullOrEmpty((string)p.Value))) 
); 

El ExpandoObject presenta una interfaz que le permite enumerar sus pares propiedad-valor como si estuvieran en un diccionario, por lo que el proceso de de chequearlos mucho más simple.

+0

Gracias por el puntero a ExpandoObject. Le doy +1, pero no puedo aceptarlo como respuesta ya que no puedo heredar de ExpandoObject, y ya que jbtule ha respondido directamente a mi pregunta. – Goran