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

C# 使用类类型创建接口列表,然后强制转换为类型返回null,c#,casting,C#,Casting,试图在一个简单的解析器项目中创建一个通用的加载文件列表函数。 只要我使用IList,它就会返回一个列表,但是当试图转换到实际的列表时,它会返回null public async static Task<IList<IFileHandlerLineVO>> LoadLineByLine(string path, Type toClass) { if (!FileExist(path)) return null; List<IFileH

试图在一个简单的解析器项目中创建一个通用的加载文件列表函数。 只要我使用IList,它就会返回一个列表,但是当试图转换到实际的列表时,它会返回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;
}
这就是我使用它的方式这很有效

IList<IFileHandlerLineVO> list = await FileHandler.LoadLineByLine(game.Filepath, typeof(GameSortVO)) as IList<IFileHandlerLineVO>;
IList list=wait FileHandler.LoadLineByLine(game.Filepath,typeof(GameSortVO))作为IList;
但是,我想运行这个不起作用有什么建议吗

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 list=wait FileHandler.LoadLineByLine(game.Filepath,typeof(GameSortVO))作为IList;
断点显示
列出空System.Collections.Generic.IList

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

var list = await LoadLineByLine("aaa", typeof(GameSortVO));
var listGameSortVO = list.Cast<GameSortVO>();
var list=wait LoadLineByLine(“aaa”,类型(GameSortVO));
var listGameSortVO=list.Cast();

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

var list = await LoadLineByLine("aaa", typeof(GameSortVO));
var listGameSortVO = list.Cast<GameSortVO>();
var list=wait LoadLineByLine(“aaa”,类型(GameSortVO));
var listGameSortVO=list.Cast();

它不起作用,因为
IList
不是
IList
。因此您不能强制转换它们,这是因为调用代码不能保证插入到
LoadLineByLine
返回的列表中的每个
IFileHandlerLineVO
实际上都是一个
GameSortVO
,仅基于该方法的签名。要么只使用接口,不要编写调用代码,要么更改方法的签名,以保证所需的具体类型。这不起作用,因为
IList
不是
IList
。因此您不能强制转换它们,这是因为调用代码不能保证插入到
LoadLineByLine
返回的列表中的每个
IFileHandlerLineVO
实际上都是一个
GameSortVO
,仅基于该方法的签名。要么只使用接口,不编写调用代码,要么更改方法的签名,以保证您想要的具体类型。这无助于我获取列表,但可以尝试使用Linq满足我的所有需求。这无助于我获取列表,但可以尝试使用Linq满足我的所有需求。