我继续在我的课程中使用下面的函数,并希望将其作为泛型。
public static IEnumerable<MyObject> Get(string csvFile)
{
return csvFile
.ReadAsStream()
.SplitCrLf()
.Where(row => !string.IsNullOrWhiteSpace(row))
.Select(row => new MyObject(row.Split(',')));
}
我抓了下面的代码但没有用
public static IEnumerable<T> Get<T>(string csvFile)
{
return csvFile
.ReadAsStream()
.SplitCrLf()
.Where(row => !string.IsNullOrWhiteSpace(row))
.Select(row => new typeof(T)(row.Split(',')));
}
请指教。谢谢!
答案 0 :(得分:11)
您无法使用new
以这种方式使用泛型类型创建实例 1 。考虑为函数提供工厂代理:
public static IEnumerable<T> Get<T>(string csvFile, Func<string[], T> factory)
{
return csvFile
.ReadAsStream()
.SplitCrLf()
.Where(row => !string.IsNullOrWhiteSpace(row))
.Select(row => factory(row.Split(',')));
}
然后你会这样称呼它:
var myObjects = Get("file.csv", row => new MyObject(row));
或者,您可以返回IEnumerable<string[]>
2 并让来电者决定如何处理它:
public static IEnumerable<string[]> Get(string csvFile)
{
return csvFile
.ReadAsStream()
.SplitCrLf()
.Where(row => !string.IsNullOrWhiteSpace(row))
.Select(row => row.Split(','));
}
然后调用者可以这样做:
var myObjects = Get("file.csv").Select(row => new MyObject(row));
1 您可以提供where T : new()
约束,然后您可以使用泛型类型创建新实例,但仅当它提供无参数构造函数时;在构造泛型类型时,您无法提供参数,并且您的用例似乎需要它。工厂代表是您最好的选择。
作为参考,这是使用泛型类型的构造在无参数情况下的外观:
public static T Create<T>() where T : new()
{
return new T();
}
2 假设您的IEnumerable<IEnumerable<string>>
构造函数也接受MyObject
,那么更好的是IEnumerable<string>
。