逗号分隔字符串到通用列表

Gop*_*opi 2 c# string reflection collections

我能够将逗号分隔的字符串转换为a IList<int>但是如何修改相同的内容以获取IList<T>T作为输入参数之一传递的位置?

即如果我需要IList<int>我将传递"int"作为参数,如果我需要IList<string>我将传递"字符串"作为参数.

我的想法是通过输入参数获取类型是int还是string,并使用反射并将字符串转换为相应的列表

将逗号分隔的字符串转换为的代码 IList<int>

public static IList<int> SplitStringUsing(this string source, string seperator =",")
{
     return source.Split(Convert.ToChar(seperator))
                  .Select(x => x.Trim())
                  .Where(x => !string.IsNullOrWhiteSpace(x))
                  .Select(int.Parse).ToList();
}
Run Code Online (Sandbox Code Playgroud)

注意:以上代码尚未测试

我正在寻找类似的东西

public static IList<T> SplitStringUsing(this string source, string seperator =",", T t)
{
find the type of t and convert it to respective List
}
Run Code Online (Sandbox Code Playgroud)

Pan*_*vos 8

您可以使用Convert.ChangeType(object,string)来解析System.Convert类支持的基类型,或者实现IConvertible接口的任何其他类.

public static IList<T> SplitStringUsing<T>(string source, string seperator = ",")
where T:IConvertible
{
        return source.Split(Convert.ToChar(seperator))
                     .Where(x => !string.IsNullOrWhiteSpace(x))
                     .Select(x=>Convert.ChangeType(x,typeof(T)))
                     .Cast<T>()
                     .ToList();
}
Run Code Online (Sandbox Code Playgroud)

为了避免本地化问题,您应该添加一个IFormatProvider参数,以允许调用者指定要使用的区域性或默认为当前区域性,例如:

public static IList<T> SplitStringUsing<T>(string source, 
    string seperator = ",",
    IFormatProvider provider =null)
    where T:IConvertible
{
    return source.Split(Convert.ToChar(seperator))
                    .Where(x => !string.IsNullOrWhiteSpace(x))
                    .Select(x=>Convert.ChangeType(x,typeof(T),provider))
                    .Cast<T>().ToList();
}
Run Code Online (Sandbox Code Playgroud)

对于更通用的情况,您可以将解析代码作为lambda传递给函数:

    public static IList<T> SplitStringUsing<T>(string source, 
        Func<string,T> parser,  
        string seperator = ",")
    {
        return source.Split(Convert.ToChar(seperator))
            .Where(x => !string.IsNullOrWhiteSpace(x))
            .Select(parser)
            .ToList();
    }
Run Code Online (Sandbox Code Playgroud)

并称之为:

var l1 = SplitStringUsing(x,s=>double.Parse(s,NumberStyles.HexNumber,
                                              CultureInfo.InvariantCulture));
Run Code Online (Sandbox Code Playgroud)

您可以在代码中使用这两种方法,编译器将选择正确的重载.