[英]Return Object type as Interface C#
我試圖從一個方法返回接口作為我的返回類型,該方法提供來自兩個不同數據源和幾個不同列的數據。 我的實現如下:
界面:
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;
時收到以下錯誤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 已經投入生產。
請幫我解決這個問題。
您需要將集合中的每個元素轉換為實例類型,linq 有一個.Cast<T>()
擴展名,這將有助於:
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 data.ToList().Cast<IBasicDTO>().ToList();
}
else
{
CIDbContext dataContext = new DBContextProvider().GetContext<CIDbContext>();
var data = dataContext.Database.ExecuteProcedure<CBasicDTO>("Read_BasicDetails", parameter);
return data.ToList().Cast<IBasicDTO>().ToList();
}
}
IEnumerable<T>
而不是IList<T>
data.ToList()
首先執行數據庫查詢。IList<T>
轉換為IList<T>
因為List<T>
已經匹配該簽名.ToList()
以匹配IList<T>
返回簽名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.