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)
您可以使用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)
您可以在代码中使用这两种方法,编译器将选择正确的重载.
| 归档时间: |
|
| 查看次数: |
1502 次 |
| 最近记录: |