У меня есть два класса: медиа и контейнер.
У меня есть два списка 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");
Вы можете использовать метод GetGenericArguments типа Type, что-то вроде этого:
object [] templates = myObject.GetType (). GetGenericArguments ();
Нужно сделать две перегрузки для этой функции, принимая каждый тип:
public void MyMethod(List<Media> source)
{
//do stuff with a Media List
}
public void MyMethod(List<Container> source)
{
//do stuff with a Container List
}
Что сказал Дэвид
Но если это должно пройти через ту же функцию, typeof
оператор должен помочь. Кроме того, это больше похоже на архитектурный недостаток. Как класс Media связан с классом Container? Есть ли какой-то общий интерфейс, используемый обоими, который они должны реализовать?
Ну, это зависит от того, каков ваш метод "// 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, в зависимости от того, что представляет собой конкретный тип фактического объекта, без необходимости писать код для различения между ними ...