使用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在接口中实现接口属性

不,那不是正确的方法。你不应该给集合设置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; 
    }        
}