我有一个函数可以在对象上找到具有空值的属性并将它们设置为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;
}
答案 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;
}