反射用列表c#修剪列表中的所有字符串

时间:2016-04-05 12:49:15

标签: c# string list reflection trim

我有一个修剪第一级所有字符串的方法。

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;
}

但如果我的属性是List,我需要在此列表中的所有字符串属性中应用trim,有人帮助我吗?

2 个答案:

答案 0 :(得分:4)

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;
}

编辑:包含的收益

Edit2:再次删除了收益率。我知道这对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;
}

答案 1 :(得分:0)

假设您需要更改源集合中的字符串,如示例所示,那么我认为最简单的方法可能是添加一个额外的扩展方法来专门处理字符串列表,而这又是利用您示例中的扩展方法,将其更改为特定于字符串的IEnumebles。新的扩展方法非常简单,如下所示:

public static IEnumerable<List<string>> Trim( this IEnumerable<List<string>> collection )
{
    foreach(var item in collection)
    {
        item.Trim();
    }
    return collection;
}

你的扩展程序会像这样调整:

public static IEnumerable<string> Trim( this IEnumerable<string> 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;
}

我保留了返回原始集合的模式,我认为这是为了提供某种类型的方法链接。

当然,这不会处理递归,但是从我所看到的并不是这里的要求。