使用类类型创建接口列表,然后强制转换为类型返回null

时间:2016-02-24 09:49:52

标签: c# casting

尝试在一个简单的解析器项目中创建一个通用的加载文件来列出函数。 只要我使用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;
}

带接口

的Class(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>

1 个答案:

答案 0 :(得分:0)

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

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