Список дженериков и кастинг

У меня есть два класса: медиа и контейнер.

У меня есть два списка List<Media>иList<Container>

Я передаю эти списки другой функции (по одной за раз);

это может быть один или другой;

Как правильно проверить тип списка «шаблон», чтобы я мог вызвать связанный метод в зависимости от типа списка?

или я должен просто попробовать приведение к списку <> и поместить вокруг него блоки Try / Catch?

    Object tagObj = mediaFlow1.BackButton.Tag;

    if (tagObj == Media)
       //do this
    else if (tagObj == Container)
        //do this
    else
        throw new Exception("Not a recognized type");
10.12.2008 20:01:30
4 ОТВЕТА
РЕШЕНИЕ

Вы можете использовать метод GetGenericArguments типа Type, что-то вроде этого:

object [] templates = myObject.GetType (). GetGenericArguments ();

3
10.12.2008 20:08:08

Нужно сделать две перегрузки для этой функции, принимая каждый тип:

public void MyMethod(List<Media> source)
{
  //do stuff with a Media List
}

public void MyMethod(List<Container> source)
{
  //do stuff with a Container List
}
11
10.12.2008 20:03:35

Что сказал Дэвид

Но если это должно пройти через ту же функцию, typeofоператор должен помочь. Кроме того, это больше похоже на архитектурный недостаток. Как класс Media связан с классом Container? Есть ли какой-то общий интерфейс, используемый обоими, который они должны реализовать?

2
10.12.2008 20:05:42
да, он должен иметь ту же функцию - это обработчик событий
Michael G 10.12.2008 20:19:23

Ну, это зависит от того, каков ваш метод "// do this" ... Если это метод, который работает на носителе или объекте-контейнере и выполняет разные действия, в зависимости от того, чем он является, то вы должны поместить этот метод в эти классы ...

Объявите интерфейс с именем ICanDoThis

public interface ICanDoThis { void DoThis(); }

убедитесь, что и Media, и Container реализуют этот интерфейс

public class Media: ICanDoThis { // }
public class Container: ICanDoThis { // }

и тогда в вашем клиентском коде «другая функция» вы можете

 public void OtherFunction(List<ICanDoThis> list)
 {
    foreach(ICanDoThis obj in list)
        obj.DoThis();
 }

И это все ... Этот код будет вызывать соответствующую реализацию либо в классе Media, либо в классе Container, в зависимости от того, что представляет собой конкретный тип фактического объекта, без необходимости писать код для различения между ними ...

0
10.12.2008 20:22:24
Это не будет работать, пока не выйдет .Net 4.0. Общие аргументы еще не знают о наследовании.
Joel Coehoorn 10.12.2008 20:32:22
Я делал это раньше с помощью базового класса. Вот для чего используется общий синтаксис where: interface ... Вы говорите, что он не работает для наследования интерфейса?
Charles Bretana 10.12.2008 20:41:37
наследование интерфейса не работает: List <Media> не наследуется от List <ICanDoThis>. Если бы OtherFunction был универсальным, вы могли бы ограничить принятые типы типами, которые реализуют ICanDoThis, и это будет работать.
Amy B 10.12.2008 20:52:46
public void OtherFunction <T> (список <T> список), где T: ICanDoThis
Joel Coehoorn 10.12.2008 21:24:24