检查类的任何属性是否为null。

16

我有以下类:

public class Requirements
    {
        public string EventMessageUId { get; set; }
        public string ProjectId { get; set; }        
        public List<Message> Message { get; set; }        
    }

我正在将其与传入的Json进行映射:

Requirements objRequirement = JsonObject.ToObject<Requirements>();

我想检查在上述映射后,类的任何属性是否没有值或为空。

为此,我尝试了:-

bool isNull= objRequirement.GetType().GetProperties().All(p => p != null);

但是在调试时,我发现无论属性是否为Null,每次都会给出值true。

请帮助我如何通过避免 For/foreach循环来实现这一点。

4个回答

32

你正在检查属性本身是否为 null(这永远不会成立),而不是属性的值。请使用以下代码:

bool isNull = objRequirement.GetType().GetProperties()
                            .All(p => p.GetValue(objRequirement) != null);

这个有效了。我做的唯一更改是p.GetValue(objRequirement,null)……GetValue方法不再接受一个参数,而是需要第二个参数。 - C Sharper

3

我使用下面的对象扩展来验证那些我不想让所有属性为空或null以节省一些数据库调用的对象。我认为它可以与其他一些情况相匹配。

    /// <summary>
    /// Returns true is all the properties of the object are null, empty or "smaller or equal to" zero (for int and double)
    /// </summary>
    /// <param name="obj">Any type of object</param>
    /// <returns></returns>
    public static bool IsObjectEmpty(this object obj)
    {
        if (Object.ReferenceEquals(obj, null))
            return true;

        return obj.GetType().GetProperties()
            .All(x => IsNullOrEmpty(x.GetValue(obj)));
    }

    /// <summary>
    /// Checks if the property value is null, empty or "smaller or equal to" zero (for numeric types)
    /// </summary>
    /// <param name="value">The property value</param>
    /// <returns></returns>
    private static bool IsNullOrEmpty(object value)
    {
        if (Object.ReferenceEquals(value, null))
            return true;

        if (value.GetType().GetTypeInfo().IsClass)
            return value.IsObjectEmpty();

        if (value is string || value is char || value is short)
            return string.IsNullOrEmpty((string) value);

        if (value is int)
            return ((int) value) <= 0;

        if (value is double)
            return ((double) value) <= 0;

        if (value is decimal)
            return ((decimal) value) <= 0;

        if (value is DateTime)
            return false;

        // ........
        // Add all other cases that we may need
        // ........

        if (value is object)
            return value.IsObjectEmpty();

        var type = value.GetType();
        return type.IsValueType
            && Object.Equals(value, Activator.CreateInstance(type));
    }

这个调用显然是 obj.IsObjectEmpty()


谢谢,我一直在寻找这个。 - Sanket Sonavane

2
这可能对你有用。
objRequirement.GetType().GetProperties()
.Where(pi => pi.GetValue(objRequirement) is string)
.Select(pi => (string) pi.GetValue(objRequirement))
.Any(value => String.IsNullOrEmpty(value));

0

我在每个属性中使用了[System.ComponentModel.DataAnnotations]的[Required]注释,以便在需要验证是否为空时进行验证。

例如:

using System.ComponentModel.DataAnnotations;

public class test
    {
        [Required]
        public string Name { get; set; }

        [Required]
        public int Age{ get; set; }

        public string Sex{ get; set; }

    }

在我的例子中,它将验证前两个属性。


解释何时以及如何验证这些将会很有用。 - Erik McKelvey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接