2013-08-29 81 views
1

爲了解決我的問題,我將不勝感激您的寶貴意見。將特定的observable集合投射到一個通用的observable集合

我有一個接口,它是沒有通用

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

不能使用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英寸Linq也可以完成foreach

該解決方案存在明顯的問題。如果有人使用二傳手在他自己的ObservableCollection<>中通過訂閱CollectionChanged事件,因爲我們實際上沒有使用他的對象,他的活動訂閱將不會兌現。等等。

相關問題