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>同样.
总结以上是内存溢出为你收集整理的c# – 泛型基本用法全部内容,希望文章能够帮你解决c# – 泛型基本用法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)