【问题标题】:Casting or converting from Task<IEnumerable<dynamic>>从 Task<IEnumerable<dynamic>> 转换或转换
【发布时间】:2021-10-22 18:36:45
【问题描述】:

我有一个对象定义为

public class MessageQueue
 {
     public string MsgTitle { get; set; }
     public string ClientID { get; set; }
     public string UserID { get; set; }
}

我有一个方法被定义为

public async Task<IEnumerable<dynamic>> DataFromDatabase()
 {
     //  This function returns IEnumerable<dynamic>. 
     // The data comes from Dapper.SqlMapper.QueryMultipleAsync() 
 }

如何将这个方法返回的数据(即 IEnumerable)转换为 MessageQueue 类型的对象?我尝试了几个选项,包括以下选项,但在运行时仍然失败:

IEnumerable<MessageQueue> result = (IEnumerable<MessageQueue>)(IEnumerable<dynamic>)srv.DataFromDatabase().Result;
List<MessageQueue> messageQueue = (List<MessageQueue>)result.Select(o => (MessageQueueToSendRet)o);

【问题讨论】:

  • 您尝试过使用 LINQ .Cast() 吗?
  • IEnumerable 结果 = srv.DataFromDatabase().Result; var messageQueue = ((IEnumerable)result).Cast().ToList();但它给了我一个运行时错误无法将“System.Collections.Generic.List`1[System.Object]”类型的对象转换为“MessageQueue”类型。

标签: c# dynamic


【解决方案1】:

类似这样的:

IEnumerable<dynamic> result = srv.DataFromDatabase().Result;
List<MessageQueue> messageQueue = result.Select(o => 
    new MessageQueue() 
      {
         MsgTitle = o.MsgTitle.ToString(), 
         ClientId = o.ClientId.ToString(), 
         UserID = o.UserID.ToString()
      } ).ToList();

因此,您不妨在 DataFromDatabase 中进行映射,Dapper 将为您完成工作。

【讨论】:

  • 这会产生运行时错误 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'System.Collections.Generic.List' 不包含 'MsgTitle' 的定义
  • 如果 oList&lt;object&gt; 你是 DataFromDatabase() 可能搞砸了。你需要发布它的实现。
  • Dapper.SqlMapper.QueryMultipleAsync() 总是返回一个对象。我将其更改为 SqlMapper.QueryAsync()。您的代码贡献很大,但我将其简化为 var messageQueue = result.Select(o => (MessageQueue)o).ToList();但我也可以使用 var messageQueue = ((IEnumerable)result).Cast().ToList();
猜你喜欢
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多