【问题标题】:Casting from a Task<IEnumerable<X>> to a Task<IEnumerable<Y>>从 Task<IEnumerable<X>> 转换为 Task<IEnumerable<Y>>
【发布时间】:2022-12-11 20:02:04
【问题描述】:

我想将项目列表从一个对象转换为另一个对象,如下所示:

public async Task<IEnumerable<TaskDetailsEntity>> GetTaskDetails(int personnelSK)
{            
   /* 
   IEnumerable<TaskDetailsEntity> TaskDetailsEntitiesList = 
      await GetKTaskDetails(personnelSK).Select(
                               a => (KTaskDetailsEntity)a).ToList();
   */
   IEnumerable<TaskDetailsEntity> TaskDetailsEntitiesList = 
         await GetKTaskDetails(personnelSK).Cast<KTaskDetailsEntity>().ToList();
            
   return TaskDetailsEntitiesList;
}


public async Task<IEnumerable<KTaskDetailsEntity>> GetKTaskDetails(int personnelSK)
{
   List<ParameterInfo> parameters = new List<ParameterInfo>();                      
   if (personnelSK != 0)
   {
      parameters.Add(new ParameterInfo(){ 
             ParameterName = "@PI_PERSONNEL_SK"
             , ParameterValue = personnelSK });
    }
    IEnumerable<KTaskDetailsEntity> KTaskDetailsEntitiesList =
            await _SQLHelper.GetRecords<KTaskDetailsEntity>(
                             "[xx].[GET_TASK_DATA]"
                             , parameters);          
    return KTaskDetailsEntitiesList;
}

但是有了这个,我在第一种方法中遇到了以下错误:

'Task&lt;IEnumerable&lt;KTaskDetailsEntity&gt;&gt;' 不包含“Cast”的定义,并且找不到接受类型为'Task&lt;IEnumerable&lt;KTaskDetailsEntity&gt;&gt;' 的第一个参数的可访问扩展方法“Cast”(是否缺少 using 指令或程序集引用?)

【问题讨论】:

  • 创建一个只将返回值转换/转换为另一种类型的包装器是毫无意义的。让被调用者处理它。
  • 例外情况是您必须包装这部分:( await GetKTaskDetails(personnelSK) ).Cast...。但我注意到您正在将 KTaskDetailsEntity 转换为 TaskDetailsEntityKTaskDetailsEntity是否继承自TaskDetailsEntity?如果它们是 2 个不同的类,您将得到 InvalidCastException...在这种情况下您需要一个映射器。例如:Automapper

标签: c# asp.net-core-mvc


【解决方案1】:

只需用大括号括起您的 await-ed 结果:

public async Task<IEnumerable<TaskDetailsEntity>> GetTaskDetails(int personnelSK)
{            
    //IEnumerable<TaskDetailsEntity> TaskDetailsEntitiesList = await GetKTaskDetails(personnelSK).Select(a => (KTaskDetailsEntity)a).ToList();
    IEnumerable<TaskDetailsEntity> TaskDetailsEntitiesList = (await GetKTaskDetails(personnelSK)).Cast<TaskDetailsEntity>().ToList();
    
    return TaskDetailsEntitiesList;
}

更新

由于IEnumerable&lt;T&gt;协方差,实际上不需要Cast&lt;&gt;在这里调用,所以,最后一个是:

public async Task<IEnumerable<TaskDetailsEntity>>GetTaskDetails(int personnelSK)
{        
  return (await GetKTaskDetails(personnelSK)).ToList();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多