如何将接口作为接口参数传递

问题描述 投票:0回答:1

我正在设计一个读取和写入 SQL Server 数据库的应用程序。我有多个类,它们只是表记录的实例(这正确地称为模型吗?)我想创建一个接口(IDataModel)供模型使用。我还想创建一个接口 (IDataModelUpdatable),其中包含由那些将使用 IDataModel 作为参数类型更新到数据库的模型实现的更新方法签名。我遇到的问题是,当我实现 IDataModelUpdatable 方法时,我无法使用模型的属性,因为它们不在 IDataModel 中。每个模型都有独特的属性,需要参考。据我了解,接口的目的是能够交换对象,只要它们实现相同的接口。有没有办法使用 IDataModel 作为参数,但引用实际类的属性?

我尝试过转换为具体类类型,甚至尝试将具体类转换为接口类型(IDataModel)。这些都不起作用。我开始认为,为了使用 IDataModel 作为参数类型,它将需要所有属性才能引用它们(这是不可行的。

    internal interface IDataModel {
      int ID { get; set; }
    }

  internal interface IDataStoreUpdatable {
    void Update(IDataModel model);
    void Update(List<IDataModel> models);
  }

  public void Update(IDataModel bom) {
    
    transaction = new CommittableTransaction();
    string updateString = $@"UPDATE tblBOMs SET lngPalletSectionID = {bom.PalletSection.ID}, lngQuoteID = {bom.QuoteID}, strComponent = '{bom.Component}',
                                                bytQuantityNeeded = {bom.QuantityNeeded}, sngBDFT = {bom.BoardFeet} WHERE lngBOMID = {bom.ID}";
    OpenConnection();
    _sqlConnection.EnlistTransaction(transaction);
c# parameters interface
1个回答
0
投票

您在数据模型中寻找的不是接口,而是抽象类。这将允许您定义模型一次,然后允许其他对象继承这些定义。您可以用它们做更多的事情,但对于您的具体示例来说,这将满足您的需要。然后,您可以将该抽象类传递给您的方法。请注意,您需要定义计划在该方法中引用的每个字段。因此,例如,当您在事务中调用类中未定义的字段时,这是行不通的。示例如下:

public abstract class DataModel
{
    public int Id { get; set; }
    //define all of your fields here
}

public class MyDataModel : DataModel
{
    //this class will now have Id because of it's inheritance
}

至于你的方法的接口,你可以 100% 使用那里的接口来确保你调用每个 CRUD 方法,并且根据你的 IDE,如果你允许的话,会自动为你搭建它们的脚手架。示例如下:

public interface IDatabaseWork
{
    public void Create(DataModel model);
    public void Update(DataModel model);
    public void Delete(DataModel model);
}

public class DatabaseWork : IDatabaseWork
{
    public void Create(DataModel model)
    {
        //adding this to show you can reference the inherited field
        var id = model.Id;
        //work here
    }

    public void Update(DataModel model)
    {
        //work here
    }

    public void Delete(DataModel model)
    {
        //work here
    }
}

这应该可以帮助您入门。您可能还想深入研究接口的使用,以了解依赖注入等概念和其他好处。

© www.soinside.com 2019 - 2024. All rights reserved.