本课题解释了如何在界面中实现界面属性: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;
}
}
}
}
答案 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;
}
}