我有一个通用的对象列表,我希望根据其中的反射值来减弱它
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不起作用,无论如何反射两次,即使它确实在第一位看起来也不正确。 有人可以解释如何绕过这个,或者可能只是一个更好的方式来做到这一点。
任何帮助,指针等都会被感激地收到
感谢
答案 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);