使用linq基于其条目的反映值过滤通用列表

时间:2012-03-08 15:09:14

标签: linq reflection

我有一个通用的对象列表,我希望根据其中的反射值来减弱它

List<MyCaseObj> CasesInGroup = ....;
PropertyInfo piItem = typeof(MyCaseObj).GetProperty(SomePropertyName).PropertyType.GetProperty(SomeValueMemberName);

    var CasesToProcess = (from csh in CasesInGroup 
        where ((Guid)piItem.GetValue(piField.GetValue(csh, null), null))
            .In(fld.Items.Select(i => i.ItemID)) 
                select csh);
然而,它发现特定值有时可能为空,并且In扩展不喜欢抛出'非静态方法需要目标'。例外

添加&amp;&amp; (Guid)piItem.GetValue(piField.GetValue(csh,null),null)!= null不起作用,无论如何反射两次,即使它确实在第一位看起来也不正确。 有人可以解释如何绕过这个,或者可能只是一个更好的方式来做到这一点。

任何帮助,指针等都会被感激地收到

感谢

1 个答案:

答案 0 :(得分:1)

你可以替换

(Guid)piItem.GetValue(piField.GetValue(csh, null), null))

(csh != null ? (Guid)piItem.GetValue(piField.GetValue(csh, null), null)) : Guid.Empty)

除非Items有时包含Guid.Empty,否则应该有效。

P.S。如果您想学习非常非常酷的东西,请将此表达式转换为lambda:

var myCaseType = typeof(MyCaseObj);
var param = Expression.Parameter(myCaseType);
var cond = Expression.Condition(
    Expression.NotEqual(param, Expression.Constant(null, myCaseType))
,   Expression.Property(param, "SomePropertyName")
,   Expression.Constant(Guid.Empty)
);
var lambda = (Func<MyCaseObj,Guid>)Expression.Lambda(cond, param).Compile();

您现在可以重写这样的选择:

var CasesToProcess = (from csh in CasesInGroup 
    where lambda(csh)In(fld.Items.Select(i => i.ItemID)) 
    select csh);