【发布时间】:2018-08-14 18:25:19
【问题描述】:
我有一个要用于 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; }
}
}
要编写更多的样板代码行,但无论如何我喜欢更明确。
【问题讨论】:
-
另外,您尝试一下会比写一个问题要快。
-
@Boo 正是我要说的 Boo。也许这更像是一个关于理解它为什么工作(或不工作)而不是它是否工作的问题,因为无论它的回答有多快,编译器都会比堆栈溢出更快地告诉你:)
-
更新了问题主体,使其更清晰。
-
@Baconcheese 也许您会收到错误消息,因为在您的界面中,
SelectedItems和SelectedStatuses没有设置器 -
@Kamyar 没有在界面中声明的setter完全没问题。
标签: c# wpf asp.net-mvc-3 mvvm