Tengo una base de código que quiero usar tanto para ASP.NET MVC como para WPF/MVVM. Los objetos comerciales se implementan como interfaces y la lógica empresarial usa estas interfaces para pasar datos.¿Implementando propiedades de interfaz en interfaces?
Supongamos que tengo una propiedad en mi interfaz que implementa IEnumerable. ¿Es posible tener diferentes versiones de esta interfaz usando diferentes implementaciones de IEnumerable? Un ejemplo de lo que estoy tratando de lograr:
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; }
}
¿Se puede hacer esto?
Edit: También debería haber preguntado "cómo", porque cuando intento esto, tengo errores similares a esta:
'MvcReportParams' no implementa 'IReportParams.SelectedStatuses' miembro de interfaz. 'MvcReportParams.SelectedStatuses' no pueden implementar 'IReportParams.SelectedStatuses' porque no tiene el tipo de retorno de juego 'System.Collections.Generic.IEnumerable'
ObservableCollection y Lista tanto en términos absolutos implementar IEnumerable, y por lo que este no parece Tiene sentido para mi.
Última edición
Bueno, alguien publicó la respuesta, pero lo borró por alguna razón, por lo que no puede marcarlo como la solución. Esto es lo que terminé haciendo:
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; }
}
}
Es más líneas de código reutilizable para escribir, pero me gusta ser más explícito de todos modos.
Absolutamente. Sí. –
Además, hubiera sido más rápido intentarlo que escribir una pregunta al respecto. –
@Boo Justo lo que iba a decir Boo. Quizás esta es más una pregunta sobre la comprensión de por qué funciona (o no) en lugar de funcionar, ya que el compilador te dirá antes que el desbordamiento de la pila, no importa cuán rápido se responda :) – dreza