虽然BO.SchoolFee.FeeCollection 看起来与BO.Student.FeeCollection 非常相似,但对于您的编译器来说,它们是非常不同的类。
你忘了给我们写FeeCollections 的类型。看来他们都实现了 IEnumerable:
class FeeCollection : IEnumerable<Fee> {...}
如果您的 FeeCollection 没有实现它,请考虑添加它。人们期望它实现IEnumerable<Fee>,甚至可能实现ICollection<Fee>。只是几行代码。
一旦您实现了IEnumerable<fee>,您的目标集合就需要一个将这个IEnumerable<Fee> 作为输入的构造函数。
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,
};
}