Интерфейс, как тип коллекции. Или как управлять коллекциями с разными типами?

241
26 марта 2018, 22:34

Добрый день. Имеется, к примеру, две модели:

public class ObjectOne : IObject
{
    public int PropertyOne { get; set; }
    public int PropertyTwo { get; set; }
    public bool IsSelected { get; set; }
}
public class ObjectTwo : IObject
{
    public int PropertyThree { get; set; }
    public int PropertyFour { get; set; }
    public bool IsSelected { get; set; }
}
public interface IObject
{
    bool IsSelected { get; set; }
}

И эти две модели исползуются, как тип в коллекции ObservableCollection

ObservableCollection<ObjectOne> ones = new ObservableCollection<ObjectOne>();
ObservableCollection<ObjectTwo> twos = new ObservableCollection<ObjectTwo>();

Мне необходимо, например, удалить элемент из коллекции, если IsSelected = false, но я не могу сделать как-нибудь одним кодом для двух этих коллекций. Передать таким образом образом не получается:

public static void Test(ObservableCollection<IObject> obj)
{
}
static void Main(string[] args)
{
   ObservableCollection<ObjectOne> ones = new ObservableCollection<ObjectOne>();
   Test(ones);
}

Есть возможность передать вот так, но тогда я теряю ссылку на объект ones.

public static void Test(List<IObject> obj)
{
}
static void Main(string[] args)
{
   ObservableCollection<ObjectOne> ones = new ObservableCollection<ObjectOne>();
   Test(ones.ToList<IObject>());
}

Как можно управлять этими двумя объектами с общими свойствами и при этом не потерять ссылку на объект?

Answer 1

Например, так:

public static void Test<T>(ObservableCollection<T> obj) where T : IObject
{
    ...
}

Возможно, вам понадобятся другие generic-ограничения.

READ ALSO
Работа на Гексагональной сеткой

Работа на Гексагональной сеткой

Здравствуйте, я столкнулся с проблемой создание гексагональной сети в WPF и одно интересно решение в вопросе Гексагональная сеткаЯ начинающий...

291
Проблема с обращением к Скрипту Button

Проблема с обращением к Скрипту Button

Здравствуйте , есть лист объектов, содержащий весь список уровней, который присутствует к игреЯ прохожу по этому списку и включаю картинки...

238
VkNet, c# Как авторизваться без приложения?

VkNet, c# Как авторизваться без приложения?

К примеру на питоне с помощью библиотеки vk_api, можно авторизваться зная только login и пароль

269
Почему вылетает IndexOutOfRangeExeption?

Почему вылетает IndexOutOfRangeExeption?

вылетает на строке heightMap[size, 0] = rndNext(0, 10); // Л-н если ввести 1

284