在使用setter的接口中实现接口属性?

时间:2014-07-02 08:15:59

标签: c# interface

本课题解释了如何在界面中实现界面属性:Implementing interface properties in interfaces?

现在我如何用这个实现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;
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

不,那不是正确的方法。你不应该有收藏家的设定者。如果您需要添加到您的收藏集,请实施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添加到集合时不会触发)。

如果您确实需要&#34;重置&#34;您的收藏集,请使用Clear()

答案 1 :(得分:0)

Is this the right way?

是。这是正确的方式。

你被困在哪里?

注意:收藏集没有设置部分。只有参与。在其获取部分中,如果它是null并且始终访问属性而不是backup-field,则初始化backup-field。喜欢这个

private IEnumerable<StatusEnum> _selectedStatuses;

public IEnumerable<StatusEnum> SelectedStatuses
{
    get 
    {
        if (_selectedStatuses == null)
            _selectedStatuses = new List<StatusEnum>();

        return _selectedStatuses; 
    }        
}