gpt4 book ai didi

c# - 返回对象类型作为接口(interface) C#

转载 作者:行者123 更新时间:2023-12-04 07:21:23 25 4
gpt4 key购买 nike

我试图从一个方法返回接口(interface)作为我的返回类型,该方法提供来自两个不同数据源的数据和几个不同的列。我的实现如下:
界面:

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 已经投入生产。
请帮我解决这个问题。

最佳答案

您需要将集合中的每个元素转换为实例类型,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>作为 List<T>已经匹配该签名
  • 我们必须调用 .ToList()最后匹配IList<T>返回签名。
  • 关于c# - 返回对象类型作为接口(interface) C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68480410/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com