如何查找嵌套对象属性的值

时间:2017-03-02 21:53:38

标签: c# object reflection

我有一个函数可以在对象上找到具有空值的属性并将它们设置为null。这很好用。现在的问题是,有时会有一个嵌套对象,我不知道如何迭代它来做同样的逻辑。

public static T SetEmptyPropertiesNull<T>(T request, Type type)
{
    foreach (PropertyInfo property in type.GetProperties())
    {
        object value = property.GetValue(request, null);

        if (string.IsNullOrWhiteSpace((value ?? string.Empty).ToString()))
            property.SetValue(request, null);
    }

    return request;
}

例如,假设我有一个Customer对象,并且在该对象上我有一个Address对象。我现在的函数将找到Customer对象上的所有空值并将它们转换为null,但它还需要找到嵌套的Address对象上的所有值并将它们转换为null。可以为不同的对象类型调用此函数,并且并非所有对象类型都具有嵌套对象。有什么想法吗?

更新

所以这很有用,但我真的很想完成这个,而不必指定对象类型AddressDto。我希望它是动态的并接受任何对象类型。

public static T SetEmptyPropertiesNull<T>(T request)
{
    foreach (PropertyInfo property in request.GetType().GetProperties())
    {
        object value = property.GetValue(request, null);

        if (value.GetType() == typeof(AddressDto))
            SetEmptyPropertiesNull(value);
        else if (string.IsNullOrWhiteSpace((value ?? string.Empty).ToString()))
            property.SetValue(request, null);
    }

    return request;
}

2 个答案:

答案 0 :(得分:0)

首先,假设'type'参数是请求参数的类型,您不需要传递它。 typeof(T)将为您提供类型。

foreach (PropertyInfo property in typeof(T).GetProperties())

接下来,要确定该属性是否为类,您可以调用

value.GetType().IsClass

所以你的代码可能如下所示:

public static T SetEmptyPropertiesNull<T>(T request)
{
    foreach (PropertyInfo property in typeof(T).GetProperties())
    {
        object value = property.GetValue(request, null);

        if (value.GetType().IsClass)
            SetEmptyPropertiesNull(value);
        else if (string.IsNullOrWhiteSpace((value ?? string.Empty).ToString()))
            property.SetValue(request, null);
    }

    return request;
}

答案 1 :(得分:0)

根据Mark Saphiro的回答,我改变了代码以避免参考周期。我将访问过的对象保存在HashSet中,只有当一个对象是一个类并且它不在集合中时才会递归。

HashSet<object> hashSet = new HashSet<object>();

public static T SetEmptyPropertiesNull<T>(T request)
{
    foreach (PropertyInfo property in typeof(T).GetProperties())
    {
        object value = property.GetValue(request, null);

        if (typeof(value).IsClass && !hashSet.Contains(value))
        {
            hashSet.Add(value);
            SetEmptyPropertiesNull(value);
        }
        else if (string.IsNullOrWhiteSpace((value ?? string.Empty).ToString()))
            property.SetValue(request, null);
     }
     return request;
}