动态对象转换为IEnumerable<dynamic>类型隐式转换报错问题
解决Cannot implicitly convert type 'MyDTO' to 'System.Collections.IEnumerable'的问题
嘿,我来帮你搞定这个类型转换的报错~
你的GetData()方法声明要返回IEnumerable<dynamic>,但实际代码里把cachedDirectory赋值成了单个MyDTO对象,最后直接返回它。C#没办法自动把一个非枚举类型的对象转换成IEnumerable集合,这就是报错的根源。
解决方案1:返回MyDTO中包含的可枚举属性
如果你的MyDTO类本身定义了一个可枚举类型的属性(比如存储数据列表的Items、DataList等),那你应该返回这个属性,而不是整个MyDTO对象:
protected override IEnumerable<dynamic> GetData() { var request = new RestRequest(); var directoryResponse = client.ExecuteTaskAsync(request).Result; // 先反序列化成强类型MyDTO MyDTO directory = JsonConvert.DeserializeObject<MyDTO>(directoryResponse.Content); // 假设MyDTO有一个IEnumerable<T>类型的属性Items cachedDirectory = directory.Items; return cachedDirectory; }
解决方案2:将单个MyDTO对象包装成可枚举集合
如果你本来就只想返回这一个MyDTO对象,那需要把它包装成一个包含单个元素的可枚举集合:
protected override IEnumerable<dynamic> GetData() { var request = new RestRequest(); var directoryResponse = client.ExecuteTaskAsync(request).Result; dynamic directory = JsonConvert.DeserializeObject<MyDTO>(directoryResponse.Content); // 用List包装单个对象 cachedDirectory = new List<dynamic> { directory }; return cachedDirectory; }
或者用Enumerable.Repeat更简洁:
cachedDirectory = Enumerable.Repeat((dynamic)directory, 1);
额外建议:避免用.Result阻塞异步任务
你当前用.Result同步等待异步操作,在某些上下文(比如ASP.NET)中可能会导致死锁,建议改成异步写法:
protected override async Task<IEnumerable<dynamic>> GetData() { var request = new RestRequest(); var directoryResponse = await client.ExecuteTaskAsync(request); MyDTO directory = JsonConvert.DeserializeObject<MyDTO>(directoryResponse.Content); cachedDirectory = directory.Items; // 或者按方案2包装成集合 return cachedDirectory; }
内容的提问来源于stack exchange,提问作者Himanshu Chawla
相关产品推荐
相关产品推荐

