Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.07.2016, 08:28   #1
j303
 
Регистрация: 07.01.2016
Сообщений: 3
По умолчанию Автоопределение типа

Привет.
Подскажите пожалуйста, кто знает. У меня есть вот такой код.
Код:
class A{}

class B : A{}

class C : A{}

void f1(B b){}
void f1(C c){}
Дальше я делаю так
Код:
List<A> i = new List<A>()
i.Add(new B());
if(i[0].GetType() == typeof(B))
	f1((B)i[0]);
else if(i[0].GetType() == typeof(C))
	f1((C)i[0]);
И это очень неудобно, если в функции f1 будет много параметров. Придётся делать множественные вложенные if и switch.
А можно ли как-то автоматически определить тип. Например
Код:
List<A> i = new List<A>()
i.Add(new B());
f1((<Автоопределение>)i[0]);

Последний раз редактировалось Alex11223; 21.07.2016 в 08:53.
j303 вне форума Ответить с цитированием
Старый 21.07.2016, 08:56   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А что f1 делает? Что в классах?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 21.07.2016, 10:04   #3
j303
 
Регистрация: 07.01.2016
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
А что f1 делает? Что в классах?
Да любые действия. Суть в том, что мне перед запуском f1 нужно из A переводить в B или C. В моём примере это не так страшно, но если было бы 5 аргументов функции f1, то был бы 5-уровневой switch. А я хотел бы в момент запуска функции автоопределять
j303 вне форума Ответить с цитированием
Старый 21.07.2016, 10:29   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Для любых никак, но если понадобилось так делать, то скорее всего стоит подумать о других вариантах реализации.

Например с помощью переопределения методов базового класса в наследниках.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 21.07.2016, 15:36   #5
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

Есть операторы is и as.
Я ещё всегда в таких местах кидаю эксцепшены на неожиданные типы.

Код:
var e = i[0];
if(e is B))
    f1(e as B);
else if(e is C)
    f1(e as C);
else
    throw new Exception("Unexpected type. "+ e.GetType();
the_deer_one вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автоопределение кода ganjubas Помощь студентам 4 12.07.2012 00:23
Автоопределение кодировки mrgrudge PHP 3 31.01.2012 18:29
Автоопределение строк в ЛистБокс Kopcuk Общие вопросы Delphi 3 24.08.2011 19:00
Автоопределение кодировки kivkiv Общие вопросы C/C++ 5 14.05.2011 14:17
Автоопределение телефона [Smarik] PHP 6 15.03.2008 17:26