c# – 泛型基本用法
发布时间:2020-12-15 04:28:56 所属栏目:百科 来源:网络整理
导读:我继续在我的课程中使用下面的函数,并希望将其写为泛型. public static IEnumerableMyObject Get(string csvFile){ return csvFile .ReadAsStream() .SplitCrLf() .Where(row = !string.IsNullOrWhiteSpace(row)) .Select(row = new MyObject(row.Split(',')
我继续在我的课程中使用下面的函数,并希望将其写为泛型.
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(','))); } 请指教.谢谢! 解决方法
您不能使用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>同样. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |