【发布时间】:2016-02-24 18:19:22
【问题描述】:
试图在一个简单的解析器项目中制作一个通用的加载文件来列出函数。
只要我使用 IList
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<IFileHandlerLineVO>不是IList<GameSortVO>。所以你不能施放它们 -
这是因为 调用 代码不能保证插入到
LoadLineByLine返回的列表中的 everyIFileHandlerLineVO是实际上是一个GameSortVO,只是基于该方法的签名。要么只使用接口,不要编写调用代码,要么更改方法的签名,以保证你想要的具体类型。