WPF - ObservableCollection casting - PullRequest
       0

WPF - ObservableCollection casting

1 голос
/ 30 ноября 2010

У меня есть метод с именем «PersonsMeeting», который получает в качестве параметра ObservableCollection of Person. Могу ли я как-нибудь доставить это в 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{}

Ответы [ 4 ]

3 голосов
/ 30 ноября 2010

Поскольку вы уже знаете, что каждый сотрудник является персоной, вы можете просто использовать 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 голос
/ 30 ноября 2010

Если вы не возражаете против дженериков:

private void PersonsMeeting<T>(ObservableCollection<T> persons) where T: Person
{
    // ....
}
1 голос
/ 30 ноября 2010
PersonsMeeting(Emp.OfType<Person>);

или

PersonsMeeting(Emp.Cast<Person>);
0 голосов
/ 30 ноября 2010

Учитывая, что класс должен быть 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 { }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...