将特定的可观察性集合转换为一般的可观察性集合

本文关键字:集合 可观察性 转换 | 更新日期: 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事件,因为我们实际上没有使用他的对象,他的事件订阅将不会得到遵守。等等。