6

300 を超えるプロパティ (型付きの Details と BlockDetails) を持つ ParsedTemplate クラスがあります。parsedTemplate オブジェクトは関数によって埋められます。このオブジェクトを埋めた後、LINQ (またはその他の方法) を使用して、「body」や「img」などのプロパティがあるかどうかを確認する必要がありIsExist=falseますPriority="high"

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; }
    ...
}
4

4 に答える 4

7

これを食欲をそそるには、独自のメソッドを作成する必要があります。幸いなことに、長くする必要はありません。何かのようなもの:

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

次に、オブジェクトにプロパティが「存在する」かどうかを確認したい場合はParsedTemplate、たとえば、LINQ を使用できます。

var existingDetails = from d in GetDetails(parsedTemplate)
                      where d.IsExist
                      select d;
于 2012-06-14T12:46:17.900 に答える
3

それをしている間に本当に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();

私のマシンで動作します。

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

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();
于 2012-06-14T12:45:00.640 に答える
1

C# リフレクションを使用します。例えば:

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

私はコンパイルしていませんが、うまくいくと思います。

于 2012-06-14T12:46:00.100 に答える
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"
                });
于 2012-06-14T12:49:41.153 に答える