加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在接口中实现接口属性?

发布时间:2020-12-15 08:08:07 所属栏目:百科 来源:网络整理
导读:我有一个代码库,我想用于ASP.NET MVC和 WPF / MVVM前端.业务对象实现为接口,业务逻辑使用这些接口传递数据. 假设我的接口上有一个实现IEnumerable的属性.是否可以使用此接口的不同版本使用IEnumerable的不同实现?我想要完成的一个例子: class Reporting{ p
我有一个代码库,我想用于ASP.NET MVC和 WPF / MVVM前端.业务对象实现为接口,业务逻辑使用这些接口传递数据.

假设我的接口上有一个实现IEnumerable的属性.是否可以使用此接口的不同版本使用IEnumerable的不同实现?我想要完成的一个例子:

class Reporting
{
    public bool RunReport(IReportParams Params);
}

interface IReportParams
{
    IEnumerable<Guid> SelectedItems { get; }
    IEnumerable<StatusEnum> SelectedStatuses { get; }
}

class MvcReportParams : IReportParams
{
    public List<Guid> SelectedItems { get; set; }
    public List<StatusEnum> SelectedStatuses { get; set; }
}

class WpfReportParams : IReportParams
{
    public ObservableCollection<Guid> SelectedItems { get; set; }
    public ObservableCollection<StatusEnum> SelectedStatuses { get; set; }
}

可以这样做吗?

编辑:我也应该问“怎么样”,因为当我尝试这个时,我得到类似这样的错误:

‘MvcReportParams’没有实现接口成员’IReportParams.SelectedStatuses’. ‘MvcReportParams.SelectedStatuses’无法实现’IReportParams.SelectedStatuses’,因为它没有匹配的返回类型’System.Collections.Generic.IEnumerable’

ObservableCollection和List都绝对实现IEnumerable,所以这对我来说似乎没有意义.

最后编辑

好吧,有人发布了答案,但是由于某种原因他们删除了它,所以我不能将其标记为解决方案.这是我最终做的事情:

interface IReportParams
{
    IEnumerable<Guid> SelectedItems { get; }
    IEnumerable<StatusEnum> SelectedStatuses { get; }
}

class MvcReportParams : IReportParams
{
    // Properties that the modelbinder dims and sets up
    public List<Guid> SelectedItems { get; set; }
    public List<StatusEnum> SelectedStatuses { get; set; }

    // Explicityly implement my interface
    IEnumerable<Guid> IReportParams.SelectedItems
    {
        get { return SelectedItems; }
    }

    IEnumerable<StatusEnum> IReportParams.SelectedStatuses
    {
        get { return SelectedStatuses; }
    }
}

class WpfReportParams : IReportParams
{
    // Properties that my view dims and modifies
    public ObservableCollection<Guid> SelectedItems { get; set; }
    public ObservableCollection<StatusEnum> SelectedStatuses { get; set; }

    // Explicityly implement my interface
    IEnumerable<Guid> IReportParams.SelectedItems
    {
        get { return SelectedItems; }
    }

    IEnumerable<StatusEnum> IReportParams.SelectedStatuses
    {
        get { return SelectedStatuses; }
    }
}

要编写更多的样板代码行,但我还是喜欢更明确.

解决方法

我可能会用只读属性来实现它.它更好地为客户端添加/删除/更新现有集合中的项目而不是完全替换集合.
interface IReportParams
{
    IEnumerable<Guid> SelectedItems { get; }
    IEnumerable<StatusEnum> SelectedStatuses { get; }
}

class MvcReportParams : IReportParams
{
    public MvcReportParams()
    {
        SelectedItems = new Collection<Guid>();
        SelectedStatuses = new Collection<StatusEnum>();
    }

    public IEnumerable<Guid> SelectedItems { get; private set; }
    public IEnumerable<StatusEnum> SelectedStatuses { get; private set; }
}

class WpfReportParams : IReportParams
{
    public WpfReportParams()
    {
        SelectedItems = new ObservableCollection<Guid>();
        SelectedStatuses = new ObservableCollection<StatusEnum>();
    }

    public IEnumerable<Guid> SelectedItems { get; private set; }
    public IEnumerable<StatusEnum> SelectedStatuses { get; private set; }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读