2012-06-14 18 views
6

ParsedTemplateクラスには、300以上のプロパティ(詳細とブロック詳細を入力)があります。 parsedTemplateオブジェクトは関数で埋められます。このオブジェクトを塗りつぶした後、LINQ(または他の方法)が必要です。IsExist=falsePriority="high"の "body"や "img"のようなプロパティがあります。私のマシンでLINQを使用したクラスプロパティの反復処理

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

作品:あなたは本当にそれをしながら、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

は、これは本当に簡単です。反射を伴いますが、LINQがどのように役立つかはわかりません。なぜ誰もがLINQのあらゆる問題を解決しようとしていますか? – cadrell0

+2

@ cadrell0人々はLINQが銀色の弾丸だと思う傾向があるので、 – sloth

+2

@ cadrell0とそれらのレーザーのものを行う奇妙な構文はすべてLINQ – sloth

答えて

7

あなたはこれを食欲をそそるために独自の方法を書く必要があります。幸いにも、それは長くなる必要はありません。何かのように:あなたはどのプロパティがParsedTemplateオブジェクトに「存在する」かどうかを確認したい場合

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

あなたは、その後、例えば、LINQを使用することができます。

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

、あなたはそのような何かを試みることができます。

または拡張メソッドの構文で:

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

は、C#のリフレクションを使用してください。例:

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

私はコンパイルしていませんが、動作すると思います。

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

これはダン・タオの答えと同じですが、彼と同じくらい再利用可能ではありません(基本的に複雑すぎて、*バリエーションでこれを繰り返す必要がある場合は解決しようとしています*)。 –

関連する問題