#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