C#:LINQ查询列出类的所有空属性

Nee*_*ers 4 c# linq reflection

我有一个这样的课:

public class Test
{
    public string STR1{ get; set; }
    public INT INT1{ get; set; }
    public DOUBLE DBL1{ get; set; }
    public DATETIME DT1{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

通常,在保存对象之前,我必须检查此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"
Run Code Online (Sandbox Code Playgroud)

但是如果我的类有更多的属性,实际上它现在包含大约42个属性,并且仍然在成长.所以我想用一种"更清洁"的方式来执行这个检查,我发现这个主题很安静,类似于我的问题:Reflection(?) - 检查类中每个属性/字段的null或为空?

但是这个解决方案不符合我的需要,因为我必须列出值= null/empty string/0/DateTime.MinValue

相信我,我想发布我的"尝试过的代码",但我无法找到一个合理的LINQ查询这个任务(我是C#的新手)

任何帮助是极大的赞赏 !

das*_*ght 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; }
Run Code Online (Sandbox Code Playgroud)

现在您可以在检查中使用这些方法:

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();
Run Code Online (Sandbox Code Playgroud)

代码的棘手部分将值转换为dynamic,然后告诉运行时为其找到最合适的IsEmpty方法.这种方法的缺点是编译器无法确定是否要找到该方法,因此您可能会在运行时获得意外类型属性的异常.

你可以通过添加一个catch-all方法来防止这些失败object,如下所示:

private static IsEmpty(object o) { return o == null; }
Run Code Online (Sandbox Code Playgroud)