【问题标题】:Casting specific observablecollection to a generic observablecollection将特定的 observablecollection 转换为通用的 observablecollection
【发布时间】:2013-09-01 08:37:08
【问题描述】:

感谢您的宝贵意见,以解决我的问题。

我有一个非通用接口

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

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

谢谢 无国界医生

【问题讨论】:

    标签: c# .net generics collections


    【解决方案1】:

    您不能使用ObservableCollection&lt;T&gt;,就好像它在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 传入他自己订阅了CollectionChanged 事件的ObservableCollection&lt;&gt;,因为我们实际上并没有使用他的对象,他的事件订阅将不会被兑现。以此类推。

    【讨论】:

      猜你喜欢
      • 2015-02-13
      • 2014-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多