我想创建一个函数,它将返回我在运行时指定的类型列表。 我沿着这条路尝试了一些东西:
public static List<T> GetMyList<T>(string[] itemList)
{
List<T> resultList = new List<T>(itemList.Length);
return resultList.AddRange(itemList);
}
但这不起作用。显然我不完全了解如何传递要转换的类型。 任何帮助将不胜感激。
编辑: 它看起来不可能,但这里有更多信息。字符串数组将包含数字,我想将这些数字有时转换为int,有时转换为short。 背后的想法是拥有一个通用函数,它将尝试将项目转换为我告诉它的任何类型列表。
答案 0 :(得分:7)
您需要提供一种将字符串转换为T的方法 - 您可以使用Func<string, T>
执行此操作:
public static List<T> GetMyList<T>(string[] itemList, Func<string, T> conversionFunc)
{
return itemList.Select(conversionFunc).ToList();
}
e.g。
List<int> ints = GetMyList(new[] { "1", "2", "3" }, s => int.Parse(s));
答案 1 :(得分:1)
我的第一个想法是,这不起作用,因为不是每个对象类型都可以从字符串构造。也许你想要的东西更像是签名:
public static List<T> GetMyList<T>(T[] itemList) { List resultList = new List(itemList.Length); foreach (t in itemList) { resultList.add(t); } return resultList; }
(原谅我的语法。我现在没有编译器方便检查它。)
答案 2 :(得分:1)
稍微优雅的解决方案是向字符串添加扩展方法,自动调用类型为T的解析器,如下所示:
public static class GenericParser {
public static T Parse<T>(this string input) {
var converter = TypeDescriptor.GetConverter(typeof(T));
if ( converter != null ) {
return ( T )converter.ConvertFromString(input);
}
return default(T);
}
}
然后,您的转换功能类似于:
public static List<T> GetMyList<T>(string[] itemList) {
List<T> list = new List<T>();
list.AddRange(Array.ConvertAll<string, T>(itemList, delegate(string s) {
return s.Parse<T>();
}));
return list;
}
用法是:
List<int> integers = GetMyList<int>(new []{"1", "2", "3", "4"});
List<double> doubles = GetMyList<double>(new []{"1.0", "2.0", "3.0", "4.0"});
等等。
答案 3 :(得分:0)
这不起作用,因为系统不知道如何将字符串转换为泛型T.即使它已知,它也不起作用,因为C#(在4之前)没有类型协方差。因此,使用foreach逐个复制和转换元素或使用Linq中的Select
答案 4 :(得分:0)
与Lee's类似,但更通用......
public static class Tools
{
public static List<TResult> ToList<T, TResult>(
this IEnumerable<T> input,
Func<T, TResult> conversion)
{
return input.Select(conversion).ToList();
}
public static List<TResult> ToList<T, TResult>(
this IEnumerable<T> input,
Func<T, int, TResult> conversion)
{
return input.Select(conversion).ToList();
}
}
class Program
{
static void Main(string[] args)
{
var input = new[] { "1", "2", "3" };
var ret = input.ToList(i => int.Parse(i));
// 1,2,3
var ret2 = input.ToList((i,j) => int.Parse(i) + j * 10);
// 1,12,23
}
}