使用setter在接口中实现接口属性
本文关键字:接口 实现 属性 使用 setter | 更新日期: 2023-09-27 18:11:10
这个问题说明如何在接口中实现接口属性:在接口中实现接口属性?
我怎么用这个实现Setter呢?我得到"无法转换源类型…"
这条路对吗?
class WpfReportParams : IReportParams
{
private ObservableCollection<StatusEnum> _selectedStatuses;
public WpfReportParams()
{
_selectedStatuses = new ObservableCollection<StatusEnum>();
}
public IEnumerable<StatusEnum> SelectedStatuses
{
get { return _selectedStatuses; }
set
{
var collection = value as ObservableCollection<StatusEnum>;
if (collection != null)
{
_selectedStatuses = collection;
}
}
}
}
不,那不是正确的方法。你不应该给集合设置setter。如果您需要添加到您的集合,实现一个Add
方法或通过IList<T>
或ICollection<T>
或支持Add
方法的类似接口来公开您的属性。
请注意,这可以使用接口的显式实现来完成,其中您可以公开与接口不同的集合。
public interface IReportParams {
IEnumerable<StatusEnum> SelectedStatuses { get; }
}
public class WpfReportParams : IReportParams {
private readonly ObservableCollection<StatusEnum> _SelectedStatuses;
public WpfReportParams() {
_SelectedStatuses = new ObservableCollection<StatusEnum>();
}
public ICollection<StatusEnum> SelectedStatuses {
get { return _SelectedStatuses; }
}
IEnumerable<StatusEnum> IReportParams.SelectedStatuses {
get { return SelectedStatuses; }
}
}
这是一个更好的解决方案,考虑到如果您有一个setter并覆盖当前集合的值,那么当前集合的所有事件处理程序都将丢失(或者至少在将新的StatusEnum添加到集合时不会触发)。
如果你确实需要"重置"你的集合,使用Clear()
代替。
Is this the right way?
是的。这是正确的方式。
你被困在哪里了?
注意:集合没有集合部分。只得到一部分。在它的get部分,我们初始化backup-field,如果它是空的,总是访问属性,而不是backup-field。这样的
private IEnumerable<StatusEnum> _selectedStatuses;
public IEnumerable<StatusEnum> SelectedStatuses
{
get
{
if (_selectedStatuses == null)
_selectedStatuses = new List<StatusEnum>();
return _selectedStatuses;
}
}