1

为了解决我的问题,我将不胜感激您的宝贵意见。

我有一个非通用接口

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”,则可以解决此问题。但是我们无法控制界面。

感谢您的所有反馈,如果您需要对有关该问题的任何内容进行分类,请与我联系。

感谢无国界医生

4

1 回答 1

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访问器中,您需要检查集合中每个项目的类型valueforeach也可以用 Linq 完成。

这种解决方案存在明显的问题。如果有人使用 setter 传入他自己ObservableCollection<>订阅CollectionChanged事件的地方,因为我们实际上并没有使用他的对象,他的事件订阅将不会被兑现。等等。

于 2013-08-29T09:09:59.920 回答