簡體   English   中英

返回對象類型作為接口 C#

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM