我有一个代码库,我想用于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; } }