【问题标题】:Generic Casting Doesn't Work通用铸造不起作用
【发布时间】:2011-12-11 07:31:00
【问题描述】:

我使用此代码加载数据并将它们转换为我使用泛型方法获得的类型:

    public List<TResult> LoadFromeStreamFile<TResult>(string Location)
    {
        List<TResult> result = new List<TResult>();

        StreamReader reader = new StreamReader(Location);

        while (!reader.EndOfStream)
        {
            result.Add((TResult)reader.ReadLine());
        }

        reader.Close();

        return result;
    }

但我在这段代码中有错误result.Add((TResult)reader.ReadLine()); 如何将string 转换为TResult??

【问题讨论】:

    标签: c# .net generics c#-4.0 generic-programming


    【解决方案1】:

    除非TResultobjectstring,否则该演员无法可能工作。假设您实际上正在尝试创建类似实体的东西,我要么建议您传入 Func&lt;string, TResult&gt; 或(最好)您使用 LINQ - 所以您不要'根本不需要这个方法:

    var list = File.ReadLines(location)
                   .Select(line => new SomeEntity(line))
                   .ToList();
    

    如果你仍然想要这个方法,你可以使用:

    public static List<TResult> LoadFromFile<TResult>(string location,
                                                      Func<string, TResult> selector)
    {
        return File.ReadLines(location).Select(selector).ToList();
    }
    

    ...但我不确定这是否值得。我想如果你经常这样做......

    (附带说明,当您确实需要从文件中读取数据时,您应该使用using 语句,这样即使抛出异常,您的文件句柄也会关闭。)

    【讨论】:

    • @ahmadalishafiee:它可以是您想要创建的任何类型 - 您作为TResult 传递的类型。我建议您可能根本不需要通用方法。将编辑。
    • 我想为我的项目编写一个助手类。我看到很多次我想加载数据,但有一些不同的类型。我想创建一个通用方法来加载数据并返回为需要数据类型。如果没有泛型方法,我该怎么做?
    • @ahmadalishafiee:你需要编写适当的代码来执行从单行到单个对象的转换,无论哪种方式,基于每种类型。泛型方法实际上只是一种多次调用它的方法。您是否觉得值得去做,或者是否每次需要时都使用 LINQ 中的Select,这取决于您。
    【解决方案2】:

    您可以通过在“TResult”中实现显式类型转换运算符来实现这一点。 从对象显式转换为 TResult。

    MSDN Reference

    这实际上“以某种方式”与“TResult”中的构造函数相同,它能够从给定对象创建构造函数(有一些假设)。

    【讨论】:

    • 泛型不支持显式转换运算符,而对某些基类没有约束,结果只能是那个基类。此外,这里的接口不是很好,因为您没有实例来调用该方法。
    • 编辑了我关于接口使用的答案。不知道泛型不支持显式转换。至少,犯错有助于学习。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多