使用LINQ迭代类属性

时间:2012-06-14 12:37:44

标签: c# .net linq linq-to-objects

有一个ParsedTemplate类,它有超过300个属性(类型为Details和BlockDetails)。 parsedTemplate对象将由函数填充。在填充此对象后,我需要一个LINQ(或其他方式)来查找是否存在“body”或“img”等属性IsExist=falsePriority="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 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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();

答案 2 :(得分:1)

使用c#反射。例如:

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

我没有编译,但我认为它有用。

答案 3 :(得分: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"
                });