将特定的observablecollection转换为通用的observablecollection

时间:2013-08-29 03:53:20

标签: c# .net generics collections

为了解决我的问题,我将非常感谢您的宝贵意见。

我有一个非通用的接口

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

1 个答案:

答案 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,因为我们实际上没有使用他的对象,他的事件订阅将不会受到尊重。等等。

相关问题