2012-06-14 15 views
6

Hay una clase ParsedTemplate que tiene más de 300 propiedades (Detalles mecanografiados y Detalles de bloque). El objeto parsedTemplate se completará con una función. Después de llenar este objeto, necesito un LINQ (u otra forma) para encontrar cualquier propiedad como "cuerpo" o "img" donde IsExist=false y Priority="high".Iteración sobre propiedades de clase utilizando LINQ

public class Details 
{ 
    public bool IsExist { get; set; } 
    public string Priority { get; set; } 
} 

public class BlockDetails : Details 
{ 
    public string Block { get; set; } 
} 

public class ParsedTemplate 
{ 
    public BlockDetails body { get; set; } 
    public BlockDetails a { get; set; } 
    public Details img { get; set; } 
    ... 
} 
+5

Esto es muy fácil hacer con la reflexión, pero no veo cómo LINQ sería útil. ¿Por qué todos intentan resolver cada problema con LINQ? – cadrell0

+2

@ cadrell0 porque la gente tiende a pensar que LINQ es una bala de plata – sloth

+2

@ cadrell0 y toda la sintaxis extraña que tiene ese material láser TIENE que ser LINQ – sloth

Respuesta

7

Tendrá que escribir su propio método para hacer este apetecible. Afortunadamente, no es necesario que sea largo. Algo así como:

static IEnumerable<Details> GetDetails(ParsedTemplate parsedTemplate) 
{ 
    return from p in typeof(ParsedTemplate).GetProperties() 
      where typeof(Details).IsAssignableFrom(p.PropertyType) 
      select (Details)p.GetValue(parsedTemplate, null); 
} 

A continuación, podría, si se quería comprobar si cualquier propiedad "existe" en un objeto ParsedTemplate, por ejemplo, utiliza LINQ:

var existingDetails = from d in GetDetails(parsedTemplate) 
         where d.IsExist 
         select d; 
3

Si realmente quería utilizar LINQ mientras se hace eso, usted podría intentar algo así:

bool isMatching = (from prop in typeof(ParsedTemplate).GetProperties() 
        where typeof(Details).IsAssignableFrom(prop.PropertyType) 
        let val = (Details)prop.GetValue(parsedTemplate, null) 
        where val != null && !val.IsExist && val.Priority == "high" 
        select val).Any(); 

funciona en mi máquina.

O en la sintaxis de método de extensión:

isMatching = typeof(ParsedTemplate).GetProperties() 
       .Where(prop => typeof(Details).IsAssignableFrom(prop.PropertyType)) 
       .Select(prop => (Details)prop.GetValue(parsedTemplate, null)) 
       .Where(val => val != null && !val.IsExist && val.Priority == "high") 
       .Any(); 
1

Use C# reflexión. Por ejemplo:

ParsedTemplate obj; 
PropertyInfo pi = obj.GetType().GetProperty("img"); 
Details value = (Details)(pi.GetValue(obj, null)); 
if(value.IsExist) 
{ 
    //Do something 
} 

No he compilado, pero creo que funciona.

0
 ParsedTemplate tpl = null; 
     // tpl initialization 
     typeof(ParsedTemplate).GetProperties() 
      .Where(p => new [] { "name", "img" }.Contains(p.Name)) 
      .Where(p => 
       { 
        Details d = (Details)p.GetValue(tpl, null) as Details; 
        return d != null && !d.IsExist && d.Priority == "high" 
       }); 
+0

Si bien esto hace lo mismo que la respuesta de Dan Tao, no es tan reutilizable como el suyo (básicamente demasiado complejo para el problema que está tratando de resolver * si necesita repetir esto para cualquier variación *). –

Cuestiones relacionadas