【问题标题】:Can not implicitly convert type List<SchoolFee.FeeCollection> to List<Student.FeeCollection> Error无法将类型 List<SchoolFee.FeeCollection> 隐式转换为 List<Student.FeeCollection> 错误
【发布时间】:2019-07-01 14:07:28
【问题描述】:

我在List&lt;BO.SchoolFee.FeeCollection&gt;List&lt;BO.Student.FeeCollection&gt; 这两个不同的位置有List 称为FeeCollection。当我将 SchoolFee.FeeCollection 对象分配给 Student.FeeCollection 时,它显示错误。我的代码

 studentObj.FeesCollectionPending = paymentlist; 

错误截图

我该如何解决这个问题?谢谢。

【问题讨论】:

  • List&lt;Student.FeeCollection&gt; 不是List&lt;SchoolFee.FeeCollection&gt; - 这是两种截然不同的类型。因此,您不能在它们之间进行分配。
  • SchoolFee.FeeCollection 和 Student.FeeCollection 是完全不同的类。
  • FeeCollection 列表在两个地方的字段相同。
  • @CGPA6.4 虽然这两个类具有相同的字段甚至名称,但它们位于不同的命名空间中,编译器将它们视为单独的类型,因为它们实际上是不同的。
  • 添加到@DarjanBogdan 评论您必须编写一个扩展方法来在两者之间进行转换。或者在单独的类中声明类型。

标签: c# asp.net list linq


【解决方案1】:

虽然BO.SchoolFee.FeeCollection 看起来与BO.Student.FeeCollection 非常相似,但对于您的编译器来说,它们是非常不同的类。

你忘了给我们写FeeCollections 的类型。看来他们都实现了 IEnumerable:

class FeeCollection : IEnumerable<Fee> {...}

如果您的 FeeCollection 没有实现它,请考虑添加它。人们期望它实现IEnumerable&lt;Fee&gt;,甚至可能实现ICollection&lt;Fee&gt;。只是几行代码。

一旦您实现了IEnumerable&lt;fee&gt;,您的目标集合就需要一个将这个IEnumerable&lt;Fee&gt; 作为输入的构造函数。

FeeCollection(IEnumerable<Fee> fees)
{
    foreach (Fee fee in fees)
       this.Add(fee);
}

如果不想添加构造函数,可以考虑创建一个转换器函数:

我会将解决方案编写为扩展函数,因此您不必更改原始类 Fee 和 FeeCollections。除了用法看起来像LINQ。 见extension method demystified

static Student.FeeCollection ToStudentFeeCollection(this IEnumerable<Fee> fees)
{
      Student.FeeCollection feeCollection = new Student.FeeCollection();
      foreach (Fee fee in fees)
      {
          feeCollection.Add(fee);
      }
      return feeCollection;
}

static Student.FeeCollection ToStudentFeeCollection(this SchoolFee.Collection schoolFeeCollection)
{
     IEnumerable<Fee> schoolFees = schoolFeeCollection;
     return schoolFees.ToStudentFees();

     // or if you don't want to implement IEnumerable<Fee>:
     var studentFeeCollection = new Student.FeeCollection();
     foreach (var schoolFee in schoolFeeCollection.GetFees())
     {
          studentFeeCollection.Add(schoolFee);
     }
}

用法:

List<School.FeeCollection> schoolFeeCollections = ...
// convert every schoolFeeCollection to a StudentFeeCollection:
List<Student.FeeCollection> studentFeeCollections = schoolFeeCollections
    .Select(schoolFeeCollection => schoolFeeCollection.ToStudentFeeCollection())
    .ToList();

甚至您的学费也可能不等于学生费用。您还需要一个转换器:

Student.Fee ToStudentFee(this School.Fee schoolFee)
{
    return new Student.Fee()
    {
        Description = schoolFee.Description,
        Amount = schoolFee.Amount,
        DueDate = schoolFee.DueDate,
    };
}

【讨论】:

    【解决方案2】:

    您不能将列表分配给列表。您需要使用 Linq 的 Select 函数或创建隐式强制转换运算符

    【讨论】:

    • 这是有用的信息,但确实需要一个代码示例作为完整答案。
    【解决方案3】:

    SISBOLibrary.BO.SchoolFee.FeesCollectionSISBOLibrary.BO.Student.FeesCollection 是两种完全不同的类型,尽管它们具有完全相同的字段。要分配paymentlist,您需要将SISBOLibrary.BO.SchoolFee.FeesCollection 映射到SISBOLibrary.BO.Student.FeesCollection,如下所示

    studentObj.FeesCollectionPending = paymentlist
        .Select(p => new SISBOLibrary.BO.Student.FeesCollection { 
            field1 = p.field1,
            field2 = p.field2,
            //and so on
        })
        .ToList(); 
    

    或者你可以使用Automapper来达到这个目的

    【讨论】:

      猜你喜欢
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-24
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多