我有一个这样的课程:
public class Test
{
public string STR1{ get; set; }
public INT INT1{ get; set; }
public DOUBLE DBL1{ get; set; }
public DATETIME DT1{ get; set; }
}
通常,在保存对象之前,我必须检查此Class中的所有属性,并在有任何empty / null属性时返回警告消息。只需检查每个属性,就可以轻松完成此操作:
if (string.IsNullOrEmpty(t.STR1))
return "STR1 is empty"
if (t.INT1 == 0)
return "INT1 = 0";
if (t.DBL1 == 0)
return "DBL1 = 0";
if (t.DT1 == DateTime.MinValue)
return "DT1 is empty"
但是,如果我的班级有更多的属性,实际上它现在包含大约42个属性,并且仍然在成长。所以我在考虑一个更清洁的"执行此检查的方法,我发现此主题与我的问题类似:Reflection (?) - Check for null or empty for each property/field in a class?
但是这个解决方案不符合我的需要,因为我必须列出值= null / empty string / 0 / DateTime.MinValue
相信我,我想发布我的"尝试过的代码"但我无法为这项任务找出合理的LINQ查询(我是C#的新手)
非常感谢任何帮助!
答案 0 :(得分:7)
由于您需要测试不同类型的对象,因此您可以将链接问题的解决方案与dynamic
结合使用,以便调度到正确的方法。
首先,为每种类型定义一个重载方法。
private static IsEmpty(string s) { return string.IsNullOrEmpty(s); }
private static IsEmpty(double f) { return f == 0.0; }
private static IsEmpty(int i) { return i == 0; }
private static IsEmpty(DateTime d) { return d == DateTime.MinValue; }
现在您可以在支票中使用这些方法:
List<string> emptyProperties = typeof(MyType).GetProperties()
.Select(prop => new { Prop = prop, Val = prop.GetValue(obj, null) } )
.Where(val => IsEmpty((dynamic)val.Val) // <<== The "magic" is here
.Select(val => val.Prop.Name)
.ToList();
代码的棘手部分将值转换为dynamic
,然后告诉运行时为其找到最合适的IsEmpty
方法。这种方法的缺点是编译器无法确定是否要找到该方法,因此您可能会在运行时获得意外类型属性的异常。
您可以通过添加object
的全能方法来防止这些失败,如下所示:
private static IsEmpty(object o) { return o == null; }