我有一个修剪所有字符串的方法.
public static IEnumerable<T> Trim<T>(this IEnumerable<T> collection)
{
foreach (var item in collection)
{
var stringProperties = item.GetType().GetProperties()
.Where(p => p.PropertyType == typeof(string));
foreach (var stringProperty in stringProperties)
{
var currentValue = (string)stringProperty.GetValue(item, null);
if (currentValue != null)
stringProperty.SetValue(item, currentValue.Trim(), null);
}
}
return collection;
}
但是,如果我的属性是一个列表,则需要在该列表中的所有字符串属性中应用修剪,有人可以帮助我吗?
解决方法:
public static IEnumerable<T> Trim<T>(this IEnumerable<T> collection)
where T:class
{
foreach (var item in collection)
{
var properties = item.GetType().GetProperties();
// Loop over properts
foreach (var property in properties)
{
if (property.PropertyType == typeof (string))
{
var currentValue = (string)property.GetValue(item);
if (currentValue != null)
property.SetValue(item, currentValue.Trim());
}
else if (typeof(IEnumerable<object>).IsAssignableFrom(property.PropertyType))
{
var currentValue = (IEnumerable<object>)property.GetValue(item);
if (currentValue != null)
currentValue.Trim();
}
}
}
return collection;
}
编辑:包括产量
编辑2:再次删除产量.我知道这对于IEnumerable扩展是不好的做法.但是,替代方法是:
else if (typeof(IEnumerable<object>).IsAssignableFrom(property.PropertyType))
{
var currentValue = (IEnumerable<object>)property.GetValue(item);
if (currentValue != null)
currentValue.Trim().ToList(); // Hack to enumerate it!
}
}
}
yield return item;
}