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

C# 使用setter在接口中实现接口属性?,c#,interface,C#,Interface,此问题说明了如何在接口中实现接口属性: 现在我如何用这个实现Setter?我得到“无法转换源类型…” 这条路对吗 class WpfReportParams : IReportParams { private ObservableCollection<StatusEnum> _selectedStatuses; public WpfReportParams() { _selectedStatuses = new ObservableColle

此问题说明了如何在接口中实现接口属性:

现在我如何用这个实现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;
            }
        }
    }
}
WpfReportParams类:IReportParams
{
私有可观察收集(u selectedstatus);
公共WpfReportParams()
{
_selectedStatuses=新的ObservableCollection();
}
公共IEnumerable SelectedStatus
{
获取{return\u selectedStatuses;}
设置
{
var集合=作为可观察集合的值;
if(集合!=null)
{
_SelectedStatus=收集;
}
}
}
}

这是正确的方法吗?

对。这是正确的方法

你被困在哪里

注意:集合没有集合部分。只得到一部分。在它的get部分,我们初始化备份字段,如果它为null,并且总是访问属性而不是备份字段。像这样

private IEnumerable<StatusEnum> _selectedStatuses;

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

        return _selectedStatuses; 
    }        
}    
private IEnumerable\u selectedstatus;
公共IEnumerable SelectedStatus
{
得到
{
如果(_selectedstatus==null)
_SelectedStatus=新列表();
返回所选状态;
}        
}    

不,那不是正确的方法。您不应该将setter设置为集合。如果需要添加到集合中,请执行
add
方法,或通过
IList
ICollection
或支持
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; }
    }
}
公共接口IReportParams{
IEnumerable SelectedStatus{get;}
}
公共类WpfReportParams:IReportParams{
私有只读可观察收集_selectedstatus;
公共WpfReportParams(){
_SelectedStatuses=新的ObservableCollection();
}
公共ICollection selected状态{
获取{return\u SelectedStatuses;}
}
IEnumerable IReportParams.SelectedStatus{
获取{返回SelectedStatus;}
}
}
这是一个更好的解决方案,考虑到如果使用setter并覆盖当前集合的值,则当前集合的所有事件处理程序都将丢失(或者至少在向集合添加新的StatusEnum时不会触发)


如果确实需要“重置”集合,请改用
Clear()

通常,集合没有设置器。如果需要添加到集合中,请实现
add
方法或通过
IList
insteadNote公开属性。注意:您可以这样做。但是,我要说OP在构造函数中正确初始化了他的字段。不需要将初始化移动到属性。@默认值:让我们看一个场景。在构造函数中,此属性已初始化,但未在任何位置使用。在这种情况下,它将保存无用的内存。初始化内部get可确保它仅在使用时初始化。。问题中没有上下文说明未使用此属性。如果使用它,则使用构造函数来构造对象。所以我认为构造函数非常适合处理这种构造。在构造函数中创建时还有其他好处,例如将字段标记为只读,这是在getter中懒散加载时无法做到的。@默认值:这就是为什么要在Note中添加字段。