【发布时间】:2021-09-29 11:21:39
【问题描述】:
我试图从一个方法返回接口作为我的返回类型,该方法提供来自两个不同数据源和几个不同列的数据。我的实现如下:
界面:
public interface IBasicDTO
{
int ID { get; set; }
string EstablishmentCode { get; set; }
DateTime? DetailsUpdatedDate { get; set; }
DateTime? PaymentUpdatedDate { get; set; }
UpdateStatus Status { get; set; }
}
BasicDTO 抽象类:
public abstract class BasicDTO : IBasicDTO, IModel
{
public int ID { get; set; }
public string EstablishmentCode { get; set; }
public DateTime? DetailsUpdatedDate { get; set; }
public DateTime? PaymentUpdatedDate { get; set; }
public UpdateStatus Status { get; set; }
}
派生类 CBasicDTO:
public class CBasicDTO : BasicDTO
{
public CBasicDTO() : base() { }
public int? CID { get; set; }
public string UniqueIdentificationNo { get; set; }
}
派生类 LBasicDTO
public class LBasicDTO : BasicDTO
{
public LBasicDTO() : base() { }
public int? LID { get; set; }
public string LIdentificatonNo { get; set; }
}
植入1方法:
public IList<IBasicDTO> GetBasicData(int CID_LID, bool IsByLID)
{
SqlParameter parameter = new SqlParameter { ParameterName = "@p_CID", Value = CID_LID };
if (IsByLID)
{
LLDbContext dataContext = new DBContextProvider().GetContext<LLDbContext>();
var data = dataContext.Database.ExecuteProcedure<LBasicDTO>("Read_BasicDetails", parameter);
return (IList<IBasicDTO>) data;
}
else
{
CIDbContext dataContext = new DBContextProvider().GetContext<CIDbContext>();
var data = dataContext.Database.ExecuteProcedure<CBasicDTO>("Read_BasicDetails", parameter);
return (IList<IBasicDTO>)data;
}
}
我在编译时没有收到任何错误,但在运行时我在 return (IList<IBasicDTO>)data; 收到以下错误
错误:
Unable to cast object of type 'System.Collections.Generic.List 1[NonTableTypes.CBasicDTO]' to type 'System.Collections.Generic.IList1[NonTableTypes.IBasicDTO]'.
如果我采用以下实现:
public IList<IBasicDTO> GetBasicData(int CID_LID, bool IsByLID)
{
SqlParameter parameter = new SqlParameter { ParameterName = "@p_CID", Value = CID_LID };
if (IsByLID)
{
LLDbContext dataContext = new DBContextProvider().GetContext<LLDbContext>();
var data = dataContext.Database.ExecuteProcedure<IBasicDTO>("Read_BasicDetails", parameter);
return (IList<IBasicDTO>) data;
}
else
{
CIDbContext dataContext = new DBContextProvider().GetContext<CIDbContext>();
var data = dataContext.Database.ExecuteProcedure<IBasicDTO>("Read_BasicDetails", parameter);
return (IList<IBasicDTO>)data;
}
}
我在运行时遇到以下错误:
The result type 'NonTableTypes.IEPFBasicDTO' may not be abstract and must include a default constructor.
将这些数据点合并到单个数据源中不是我们的选择,因为这些数据源非常大,而且 CBasicDTO 已经投入生产。
请帮我解决这个问题。
【问题讨论】:
-
List<LBasicDTO>不是List<IBasicDTO>。如果允许该强制转换,您将能够在其中插入CBasicDTO,尽管 single 列表对象仍声称是LBasicDTO对象的列表。 -
@Damien_The_Unbeliever 我明白了这一点,但是如何根据条件从方法中返回两个不同的派生类列表?
标签: c# entity-framework inheritance interface