gpt4 book ai didi

c# - 泛型的基本用法

转载 作者:太空狗 更新时间:2023-10-29 21:09:35 27 4
gpt4 key购买 nike

我一直在我的类(class)中使用下面的函数,并希望将其编写为泛型。

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。考虑为函数提供工厂委托(delegate):

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# - 泛型的基本用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14462647/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com