【问题标题】:Create interface list with class type, then cast to type returns null使用类类型创建接口列表,然后转换为类型返回 null
【发布时间】:2016-02-24 18:19:22
【问题描述】:

试图在一个简单的解析器项目中制作一个通用的加载文件来列出函数。 只要我使用 IList,它就会返回一个列表,但是当尝试转换为实际的 List 时,它会返回 null。

public async static Task<IList<IFileHandlerLineVO>> LoadLineByLine(string path, Type toClass)
{
    if (!FileExist(path))
        return null;

    List<IFileHandlerLineVO> list = new List<IFileHandlerLineVO>();

    StreamReader fs = new StreamReader(path);
    string readline;
    while ((readline = await fs.ReadLineAsync()) != null)
    {
        IFileHandlerLineVO instance = (IFileHandlerLineVO)Activator.CreateInstance(toClass);
        instance.Input = readline;
        list.Add(instance);

        // NOTE: A cast here shows that instance is the correct class 'GameSortVO'
    }

    fs.Close();
    fs.Dispose();

    return list;
}

带接口的类(ValueObject)

public class GameSortVO : IFileHandlerLineVO
{
    public string Input { get; set; }
    public string Output { get; set; }
    public int Number { get; set; }
    public int Random { get; set; }
}

这就是我使用它的方式。 这行得通

IList<IFileHandlerLineVO> list = await FileHandler.LoadLineByLine(game.Filepath, typeof(GameSortVO)) as IList<IFileHandlerLineVO>;

但是,我想运行它。 不起作用有什么建议吗?

IList<GameSortVO> list = await FileHandler.LoadLineByLine(game.Filepath, typeof(GameSortVO)) as IList<GameSortVO>;

breakpoint shows
    list    null    System.Collections.Generic.IList<parser.vo.GameSortVO>

【问题讨论】:

  • 它不起作用,因为IList&lt;IFileHandlerLineVO&gt; 不是IList&lt;GameSortVO&gt;。所以你不能施放它们
  • 这是因为 调用 代码不能保证插入到 LoadLineByLine 返回的列表中的 every IFileHandlerLineVO 是实际上是一个GameSortVO,只是基于该方法的签名。要么只使用接口,不要编写调用代码,要么更改方法的签名,以保证你想要的具体类型。

标签: c# casting


【解决方案1】:

您需要转换元素,而不是列表本身。 您可以使用 Linq 的 Cast 方法来投射元素:

var list = await LoadLineByLine("aaa", typeof(GameSortVO));
var listGameSortVO = list.Cast<GameSortVO>();

【讨论】:

  • 这并没有帮助我获得 List 但可以尝试使用 Linq 来满足我的所有需求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-13
  • 1970-01-01
  • 2010-11-18
相关资源
最近更新 更多