C# 使用类类型创建接口列表,然后强制转换为类型返回null
试图在一个简单的解析器项目中创建一个通用的加载文件列表函数。 只要我使用IListC# 使用类类型创建接口列表,然后强制转换为类型返回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
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满足我的所有需求。