2012-06-14 4 views
6

Esiste una classe ParsedTemplate con oltre 300 proprietà (Dettagli digitati e BlockDetails). L'oggetto parsedTemplate sarà riempito da una funzione. Dopo aver riempito questo oggetto ho bisogno di un LINQ (o altro modo) per trovare ci sono proprietà come "body" o "img" dove IsExist=false e Priority="high".Iterazione delle proprietà della classe tramite 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

Questo è veramente facile da fare con la riflessione, ma non vedo come LINQ sarebbe utile. Perché tutti cercano di risolvere ogni problema con LINQ? – cadrell0

+2

@ cadrell0 perché la gente tende a pensare LINQ è un proiettile d'argento – sloth

+2

@ cadrell0 e tutta la strana sintassi che fa quella roba laser deve essere LINQ – sloth

risposta

7

Avrai bisogno di scrivere il tuo metodo per renderlo appetitoso. Fortunatamente, non ha bisogno di essere lungo. Qualcosa di simile:

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

Si potrebbe quindi, se si voleva verificare se qualsiasi proprietà "esiste" su un oggetto ParsedTemplate, ad esempio, utilizzare LINQ:

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

Se davvero si voleva utilizzare LINQ mentre si fa questo, si potrebbe provare qualcosa di simile:

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(); 

Opere sulla mia macchina.

O nel metodo di sintassi di estensione:

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

Usa C# riflessione. Ad esempio:

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

Non ho compilato ma penso che funzioni.

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

Mentre questo fa la stessa risposta di Dan Tao, non è così riusabile come il suo (fondamentalmente troppo complesso per il problema che sta cercando di risolvere * se è necessario ripeterlo per eventuali variazioni *). –