如何从另一个财产获得财产价值?

时间:2019-03-07 08:28:07

标签: c#

我有以下界面:

public interface IReport
{
    int ReportId {get; set;}
}

我有一个具有标识列属性的实体:

public int PaymentReportId {get; set;}

我需要PaymentReport来实现IReport

在我的 PaymentReport.cs 中,我做了:

public int PaymentReportId {get; set;}

public int ReportId {
    get => PaymentReportId; 
    set {} //no need to ever set this;
}

否则,编译器会抱怨没有实现设置器。

是否有一种更清洁的方法?

3 个答案:

答案 0 :(得分:1)

我从IReport的ReportId中删除了该集合,然后在该类中实现了。

public interface IReport
{
    int  ReportId { get;  }
}

public class PaymentReport : IReport
{
    public int PaymentReportId { get; set; }
    public int ReportId
    {
        get => PaymentReportId;
    }
}

答案 1 :(得分:1)

如果您尝试遵守SOLID,则有一种称为接口隔离的原则。

  

接口隔离原则(ISP)规定,不应强迫任何客户端依赖其不使用的方法。

您的方法显然会违反该原理,因为类PaymentReport确实具有属性设置程序,而该属性设置程序基本上是不需要的。


请考虑将IReport分为IReportReadIReportWrite并仅实施必要的内容。

public interface IReportRead
{
    int ReportId { get; }
}

public interface IReportWrite
{
    int ReportId { set; }
}

public class PaymentReport : IReportRead {//...}

这样,您就可以清晰地抽象出来,并且不会污染实现。

答案 2 :(得分:1)

正如其他人所说,最干净的方法是更改​​界面或拆分为 几个接口。以下是将接口分为两个示例并在getget, set场景中使用它们的示例:

interface IFooGet
{
    int Id { get; }
}

interface IFooSet
{
    int Id { set; }
}

public class FooGet : IFooGet
{
    public int Id { get; }
}

public class FooGetSet : IFooGet, IFooSet
{
    public int Id { get; set; }
}

如果这不可能(也许您不拥有该接口的代码?),则在有人尝试调用该属性时,您可能会引发异常。

class PaymentReport : IReport
{
    public int PaymentReportId {get; set;}

    public int ReportId {
        get => PaymentReportId; 
        set => throw new NotSupportedException();
    }
}

如果将来某些代码试图调用setter并假设setter实际上确实有意义,那么set中只是一个空的正文有时可能会导致错误隐藏https://en.wikipedia.org/wiki/Error_hiding