它会编译,但它可能不会做你想做的事。请记住,List<ExtendedSubTransfer> 不会扩展 List<SubTransfer>。例如,如果您有任何使用基类的操作,您将得不到您想要的。为了演示,让我们假设基类有一个 ID,而您想要打印这些 ID。
public void PrintIds()
{
ExtendedTransfer extendedTransfer = _database.GetExtendedTransfer(...);
PrintSubTransferIds(extendedTransfer);
}
private PrintSubTransferIds(Transfer transfer)
{
foreach(var subTransfer in transfer.SubTransfers)
{
Console.WriteLine(subTransfer.Id);
}
}
除非您在从数据库加载项目时做了一些非常奇怪的事情,否则上述方法将不起作用。例如,如果您的加载代码看起来像...
public GetExtendedTransfer(...)
{
ExtendedTransfer result = new ExtendedTransfer();
List<ExtendedSubTransfer> subTransfers = _connection.QueryForSubTransfers(...);
result.SubTransfers = subTransfers;
return result;
}
然后就不行了。它不会打印任何子传输 ID,因为 transfer.SubTransfers 将是一个空列表。相反,当从数据库加载时,你必须做一些奇怪的事情......
public GetExtendedTransfer(...)
{
ExtendedTransfer result = new ExtendedTransfer();
List<ExtendedSubTransfer> subTransfers = _connection.QueryForSubTransfers(...);
result.SubTransfers = subTransfers;
Transfer subtypedResult = result;
subtypedResult.SubTransfers = subTransfers.Cast<SubTransfer>();
return result;
}
此外,以下情况将是编译时错误:
public void PrintIds()
{
ExtendedTransfer extendedTransfer = _database.GetExtendedTransfer(...);
PrintSubTransferIds(extendedTransfer.SubTransfers);
}
private PrintSubTransferIds(List<SubTransfer> subTransfers)
{
foreach(var subTransfer in subTransfers)
{
Console.WriteLine(subTransfer.Id);
}
}
这将无法编译,因为extendedTransfer.SubTransfers 的类型为List<ExtendedSubTransfer>,无法分配给List<SubTransfer>。
更新:那你应该怎么做?
C#(4.X 及更高版本)允许在certain interfaces 上使用covariance,例如IReadOnlyList(C# 4.5 及更高版本)。这样你就可以...
public class Transfer
{
public virtual IReadOnlyList<SubTransfer> SubTransfers { get; private set; }
public void SetSubTransfers(List<SubTransfer> subTransfers)
{
SubTransfers = subTransfers;
}
}
public class ExtendedTransfer
{
private List<ExtendedSubTransfer> _subTransfers;
public override IReadOnlyList<SubTransfer> SubTransfers
{
get { return _subTransfers; }
}
public void SetSubTransfers(List<ExtendedSubTransfer> subTransfers)
{
_subTransfers = subTransfers;
}
}
这将是我解决您的问题的最佳尝试。但是,您没有提到如何从数据库中获取实体。我认为EntityFramework 默认情况下不会对这种字段排列感到满意。