как я могу перебирать динамический класс ObservableCollection внутри метода

#c# #wpf

Вопрос:

привет, я пытаюсь передать динамический [ObservableCollection] Список для метода как я могу получить ключи и перебирать значения внутри метода, не передавая класс [Игрок]

это мой код

 {
    public static ObservableCollection<Player> items = new ObservableCollection<Player>();
    public TEST()
    {
        InitializeComponent();
        GroupsDataG.ItemsSource = items;
    }

    public class Player
    {
        public int ID { get; set; }
        public string FName { get; set; }
        public string LName { get; set; }
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        // Add Random Data On Click
        items.Add(new Player() { ID = 1, FName = "aaaa", LName = "bbbb" });
        items.Add(new Player() { ID = 2, FName = "cccc", LName = "yyyyy" });

        // Passing The [ObservableCollection] List to a method
        GetMyData(items);
    }

    public static void GetMyData<T>(ObservableCollection<T> collection)
    {
        // How Can i get values
        foreach (var item in collection)
        {
            //
        }
    }
}
 

Комментарии:

1. Я не уверен, в чем проблема. Вам нужно GetMyData(ObservableCollection<Player> collection) вместо GetMyData<T>(ObservableCollection<T> collection) этого ?

Ответ №1:

Создайте интерфейс, имеющий общие свойства/методы, к которым вы хотите получить доступ «в общем виде», а затем используйте его в своем методе GetMyData. GetMyData может затем получить доступ ко всему, что определено в этом интерфейсе, независимо от того, какой класс T, если он реализует интерфейс:

 public interface IPlayer
{
    int ID { get; }
    string FName { get; set; }
    string LName { get; set; }
}

public class Player : IPlayer
{
    public int ID { get; set; }
    public string FName { get; set; }
    public string LName { get; set; }
}

public class SomeOtherPlayer : IPlayer
{
    public int ID { get; set; }
    public string FName { get; set; }
    public string LName { get; set; }

    public int Score { get; set; }
}

//you can also change the parameter from ObservableCollection to IEnumerable if all you need is to iterate through a collection. this allows the method to accept different types of generic collections and not just ObservableCollection.
public static void GetMyData<T>(IEnumerable<T> collection) where T : IPlayer
{
    // How Can i get values
    foreach (T player in collection)
    {
        //now you can access IPlayer
        player.ID = 0;
    }
}
 

Комментарии:

1. без общего ограничения player.ID не будет компилироваться, потому что тип T не имеет свойства/поля идентификатора. Т вполне может быть просто object