微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 泛型基本用法

我继续在我的课程中使用下面的函数,并希望将其写为泛型.
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>同样.

原文地址:https://www.jb51.cc/csharp/91483.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐