2010-11-30 68 views
1

我有一个名为“PersonsMeeting”那得是个人的参数的ObservableCollection方法。我可以以某种方式将它传递给员工的ObservableCollection?我需要什么铸件?WPF - 铸造的ObservableCollection

P.S - 我不希望因为我使用它的功能获得的方法摆脱的ObservableCollection类型。

public partial class MainWindow : Window 
{ 
    public ObservableCollection<Employee> Emp { get; set; } 

    public MainWindow() 
    { 
     Emp = new ObservableCollection<Employee>(); 

     InitializeComponent(); 
     PersonsMeeting(Emp); // How Do I Cast this ?!?!?!?? 
    } 

    private void PersonsMeeting(ObservableCollection<Person> persons) 
    { 
     // .... 
    } 
} 

public class Person{} 
public class Employee : Person{} 
+0

,如果你不你PersonsMeeting功能需要的的ObservableCollection 功能,也许你可以使用一个更通用的接口,为您的原型样的IList 甚至IEnumerable 。 – 2010-11-30 16:05:31

+0

@Joachim Kerschbaumer - 不幸的是我确实需要它。 – Erez 2010-11-30 16:21:26

回答

3

既然你已经知道,每一位员工都是一个人,你可以简单地使用Enumerable.Cast的元素转换为所需要的类型:

PersonsMeeting (Emp.Cast());

PersonsMeeting(new ObservableCollection<Person>(Emp.Cast<Person>())); 

但这很可能不会产生你所期望,因为你实际上是在创建一个新的ObservableCollection,而不是利用现有的一个结果。

更新2

我注意到PersonsMeeting方法是私有的,并且你永远只能用ObservableCollection<Employee>调用它。

如果是这样的话,那么你想在你的私有方法使用一个不必要的抽象。你可以安全地摆脱这一点,只需修改PersonsMeeting采取ObservableCollection<Employee>

另一种选择是改变你的类暴露其数据的方式。如果你想保持抽象,让你的类的样子:

public partial class MainWindow : Window 
{ 
    private ReadOnlyObservableCollection<Person> _readOnlyEmp = null; 
    private ObservableCollection<Person> _emp = new ObservableCollection<Person>; 

    public ReadOnlyObservableCollection<Person> Emp 
    { 
     if(_readOnlyEmp = null) 
      _readOnlyEmp = new ReadOnlyObservableCollection<Person>(_emp); 

     return _readOnlyEmp; 
    } 

    public void AddEmployee(Employee e) 
    { 
     _emp.Add(e); 
    } 

    public void RemoveEmployee(Employee e) 
    { 
     _emp.Remove(e); 
    } 
} 
1
PersonsMeeting(Emp.OfType<Person>); 

PersonsMeeting(Emp.Cast<Person>); 
+0

感谢但未通过编译,请参阅我的意见 Justin Niessner – Erez 2010-11-30 16:35:19

+0

如果PersonsMeeting采用ObservableCollection作为参数,则使用任何方法都将失败,因为在调用OfType 或'OfType '后没有'ObservableCollection`,演员` – furier 2013-12-19 13:53:33

0

考虑到类应该是的ObservableCollection,试试这个:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var employees = new ObservableCollection<Employee>(); 
     var persons = employees.OfType<Person>(); 

     Test(new ObservableCollection<Person>(persons)); 
    } 

    static void Test(ObservableCollection<Person> persons) 
    { 
     // Do something 
    } 
} 

public class Person { } 
public class Employee : Person { } 
1

如果你不介意的仿制药:

private void PersonsMeeting<T>(ObservableCollection<T> persons) where T: Person 
{ 
    // .... 
}