Bạn không thể sử dụng new
để tạo các trường hợp sử dụng các loại chung theo cách này . Xem xét cung cấp một đại biểu nhà máy với chức năng:
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(',')));
}
Sau đó, bạn sẽ gọi nó là như vậy:
var myObjects = Get("file.csv", row => new MyObject(row));
Ngoài ra, bạn có thể trở lại một IEnumerable<string[]>
và để cho người gọi quyết định làm gì với nó:
public static IEnumerable<string[]> Get(string csvFile)
{
return csvFile
.ReadAsStream()
.SplitCrLf()
.Where(row => !string.IsNullOrWhiteSpace(row))
.Select(row => row.Split(','));
}
Sau đó người gọi có thể làm:
01.
var myObjects = Get("file.csv").Select(row => new MyObject(row));
Bạn có thể cung cấp các where T : new()
hạn chế và sau đó bạn có thể tạo ra các trường hợp mới sử dụng một kiểu generic, nhưng chỉ khi nó cung cấp một constructor không có đối số; bạn không thể cung cấp các đối số khi xây dựng các kiểu generic và trường hợp sử dụng của bạn dường như yêu cầu nó. Một đại biểu nhà máy là lựa chọn tốt nhất của bạn ở đây.
Để tham khảo, đây là cách xây dựng sử dụng các loại generic sẽ tìm trong các trường hợp không tham số:
public static T Create<T>() where T : new()
{
return new T();
}
Thậm chí tốt hơn sẽ là một IEnumerable<IEnumerable<string>>
giả định rằng constructor MyObject
của bạn chấp nhận IEnumerable<string>
là tốt.
Không hoạt động, theo cách nào? – JLRishe
Có lẽ không biên dịch, vì 'new typeof (T)' là cú pháp không hợp lệ. – cdhowie
Bạn có thể tạo một 'IEnumerable' từ tệp csv. Để chuyển nó thành một 'IEnumerable ', bạn sẽ cần định nghĩa một hàm chuyển đổi 'Func ' và áp dụng nó. –
ja72