【问题标题】:C# : LINQ query to list all empty properties of a classC#:LINQ 查询列出类的所有空属性
【发布时间】:2014-06-28 10:11:42
【问题描述】:

我有这样的课:

public class Test
{
    public string STR1{ get; set; }
    public INT INT1{ get; set; }
    public DOUBLE DBL1{ get; set; }
    public DATETIME DT1{ get; set; }
}

通常,在保存对象之前,我必须检查该类中的所有属性,如果有任何空/空属性,则返回警告消息。有一个简单的方法可以通过简单地检查每个属性来做到这一点:

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# 的新手)

非常感谢任何帮助!

【问题讨论】:

  • 所以不要使用 LINQ 查询,而是使用带有一些反射的普通循环?检查每个属性的类型并使用适当的默认值。或者只是检查default(),因为这是你每次都使用的。
  • @hoangnnm 您可以将属性上的属性用作默认值。然后检查一个属性的当前值是否不等于它的默认值。
  • @JeroenVannevel 很抱歉没有提到,我确实使用了一个普通的循环,就像你上面所说的那样。我在问题中的例子不是我现在使用的,它只是表达我的问题的一种方式。我真正关心的是我能否使用 LINQ 实现这一目标。
  • 不过默认值也是个好主意,谢谢!

标签: c# linq reflection


【解决方案1】:

由于您需要测试不同类型的对象,您可以将链接问题中的解决方案与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; }

【讨论】:

  • 哇,我无语了,这正是我需要的,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多