将特定的可观察性集合转换为一般的可观察性集合
本文关键字:集合 可观察性 转换 | 更新日期: 2023-09-27 18:29:22
为了解决我的问题,我非常感谢您的宝贵意见。
我有一个不是通用的接口
public interface IOffice
{
ObservableCollection<Employee> Employees{ get; set; }
}
"雇员"是一个实体。
public class Employee
{
public int Id {get;set;}
public string Name {get, set}
}
我在一个通用抽象类中扩展了这个接口,这有助于发送任何扩展的作为类型参数的Employee的类型。但是,在下面这样的抽象类中,我遇到了将特定属性"Employees"转换为通用"Employer"属性的问题。它显示编译器强制转换错误。
public abstract HeadOffice<T> : IOffice
where T : Employee
{
ObservableCollection<T> _employees = new ObservableCollection<T>();
public ObservableCollection<Employee> Employees
{
get{return employees;}
set{employees = value;}
}
}
注意:如果我们可以将接口更改为通用的"IOffice",则可以解决此问题。但我们无法控制接口。
感谢您的所有反馈,如果您需要对该问题进行分类,请联系我。
谢谢RSF
不能将ObservableCollection<T>
用作T
中的协变和逆变。这毫无意义。
也许你想复制收藏(但这可能很贵!):
public abstract HeadOffice<T> : IOffice
where T : Employee
{
ObservableCollection<T> _employees = new ObservableCollection<T>();
public ObservableCollection<Employee> Employees
{
get
{
return new ObservableCollection<Employee>(_employees);
}
set
{
_employees.Clear();
foreach (var e in value)
{
var t = e as T;
if (t == null)
throw new InvalidOperationException("...");
_employees.Add(t);
}
}
}
}
在set
访问器中,您需要检查集合value
中每个项的类型。foreach
也可以用Linq完成。
这种解决方案存在明显的问题。如果有人使用setter传入他自己的ObservableCollection<>
,他已经订阅了CollectionChanged
事件,因为我们实际上没有使用他的对象,他的事件订阅将不会得到遵守。等等。