Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:列出类的所有空属性的LINQ查询_C#_Linq_Reflection - Fatal编程技术网

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

C#:列出类的所有空属性的LINQ查询,c#,linq,reflection,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; } } if (string.IsNullOrEmpty(t.STR1)) return "STR1 is empty" if (t.INT1 ==

我有一门课是这样的:

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"
通常,在保存对象之前,我必须检查该类中的所有属性,如果存在任何空/null属性,则返回警告消息。有一种简单的方法可以做到这一点,只需像这样检查每个属性:

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个属性,并且还在成长。所以我想用一种“更干净”的方式来执行这个检查,我发现这个话题与我的问题非常相似:

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

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


非常感谢您的帮助

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

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