为了解决我的问题,我将非常感谢您的宝贵意见。
我有一个非通用的接口
public interface IOffice
{
ObservableCollection<Employee> Employees{ get; set; }
}
'员工'是一个实体。
public class Employee
{
public int Id {get;set;}
public string Name {get, set}
}
我在一个通用抽象类中扩展了这个接口,这有助于发送任何扩展 Employee的类型作为类型参数。 但我有一个问题是将特定属性“Employees”转换为抽象类中的泛型“Employee”属性,如下所示。 它显示编译器转换错误。
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
答案 0 :(得分:0)
您无法使用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
,因为我们实际上没有使用他的对象,他的事件订阅将不会受到尊重。等等。