![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| DenWPF |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1659 Регистрация: 26.9.2009 Репутация: нет Всего: 1 |
Сложно объяснить проще показать.
вот у меня есть список "bit.ly", "j.mp", "u.nu", "kl.am " для каждого элемента свой класс. я не хочу делать конструкцию:
можно это как то по другому сделать. |
|||
|
||||
| Mephisto |
|
|||
![]() Волкъ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1818 Регистрация: 27.8.2003 Где: Питер Репутация: 2 Всего: 34 |
Можно сделать Dictionary по принципу string, Type. По ключу получать тип и инстанциорвать уже потом.
Либо просто фабричный метод со switch'ом. Добавлено через 1 минуту и 6 секунд Семантически то на то и выйдет. Только первый случай не читается глазками. В случае лага только отладчик поможет. |
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 7 Всего: 306 |
От чего бы в самом списке не хранить сами объекты. С перегруженным ToString() для более удобоваримого внешнего вида.
|
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 6 Всего: 211 |
||||
|
||||
| mihryak |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 19 Всего: 36 |
открываем и видим
т.е. от разбора всех вариантов фабрика не спасает, но почему-то её часто преподносят в качестве панацеи от сабжевой проблемы едиственное (и самое важное и полезное), что она даёт, - это локализация кода, разбирающего варианты, в одном месте а так, оба способа Mephisto гораздо симпатичнее кучи if-else |
|||
|
||||
| DenWPF |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1659 Регистрация: 26.9.2009 Репутация: нет Всего: 1 |
ясно...проще через ифы
|
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
Вообще-то в ряде случаев код можно упростить и даже обойтись без ифов, но для того, чтобы что-то конкретное предложить надо иметь немного больше информации. Например непонятно откуда берётся список строк, по которым надо строить объекты. Если ты их получаешь откуда-то именно в таком виде, то будет одно решение, а если ты сам придумал таким незамысловатым способом хранить информацию о типах - другое. Так же неплохо было бы выяснить какая связь между классами,, экземпляры которых надо строить(например расположены они в однойсборке и пространстве имён или в разных, или они имеют общего предка или как-то ещё объединены), кроме того, из кода можно вроде бы сделать вывод, что имя класса можно получить заменой точки на знак подчёркивания, но вопрос работает ли это для всех строк. И потом не очень понятно, что значит "я не хочу делать...", есть какие причины для этого или просто "не хочу и всё"? -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| DenWPF |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1659 Регистрация: 26.9.2009 Репутация: нет Всего: 1 |
причина если объектов..т.е классов будет 100... ифы будут мягко говоря не удобны.
да правельно заметили если заменить, "." на "_" и первая буква заглавная и если первая не буквы а цифра то поставить перед ней "_" 3.ui = _3_ui это все беру из писка куда сам все записываю, всё находится в одной сборке и под одним неймспэйсом |
|||
|
||||
| diadiavova |
|
||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
Совсем другое дело. Тогда твоя проблема решается стандартными инструментами.
Если есть возможность вместо странных строк с заменой символов использовать другие, то надо так и сделать. Для класса по имени Bit_ly надо хранить строку, которую возвратит выражение
Для других то же самое. Создать объект по такой строке можно выражением
Если такой возможности нет, то можно при помощи рефлексии собрать типы из одного пространства и(сформировав предварительно имя класса заменой точки) найти в списке нужный тип, а дальше так же через активатор, но думаю это не понадобится. Это сообщение отредактировал(а) diadiavova - 5.4.2010, 23:49 -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
||||
|
|||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 6 Всего: 211 |
||||
|
||||
| DenWPF |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1659 Регистрация: 26.9.2009 Репутация: нет Всего: 1 |
diadiavova, я примерно понял, но все равно не догнал как сделать. да и вообще читаю ваши посты и понимаю что не понимаю даже не которых терминах.
Пора наверное переходить из пользовательского программирования. в личку кинте что почитать. |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
Честно говоря понятия не имею, в принципе всё есть в мсдн. Тогда пиши что непонятно постараюсь объяснить "на пальцах". -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| DenWPF |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1659 Регистрация: 26.9.2009 Репутация: нет Всего: 1 |
думаю достаточно будет примера. есть строка "bit.ly"
к примеру уже есть функция которая её переделывает в нужный формат(имя класса) Bit_ly. как теперь мне создать объект такого класса? |
|||
|
||||
| diadiavova |
|
||||||||||||||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
Для начала...в предыдущем примере я немного ошибся, там вместо ToString тфдо использовать свойство AssemblyQualifiedName
Я честно говоря так и не понял какая необходимость есть в том, чтобы хранить строки в таком ненадёжном формате. Для начала разжую мою идею. Возьмём класс Button из винформ.
Выполнив такое присвоение ты получишь в переменной buttonstring следующую строку
Эта строка полностью описывает тип в сборке и именно её и надо хранить в коллекции. Для любого своего класса ты можешь получить подобную строку тем же способом. Далее для того, чтобы создать по этой строке кнопку надо выполнить код
Где typestring - как раз и есть переменная с этой строкой. То есть иными словами по такой строке ты создаёшь экземпляр типа Type, а уже из него при помощи активатора экземпляр целевого типа(в данном случае Button). Теперь пара слов о том, как получить полный список таких строк, скажем для классов расположенных в одном пространстве имён. В принципе для выполнения подобных операций тебе надо ознакомиться с пространством System.Reflection и классом System.Type. Общий принцип такой: Сначала надо получить экземпляр класса Assembly для сборки, в которой все эти типы описаны. Для этого надо воспользоваться статическими методами самого класса Assembly, например для получения ссылки на ту сборку, в которой выполняется код, можно использовать метод GetExecutingAssembly, то есть этот класс и его члены тебе надо будет изучить. Другой вариант получения ссылки на нужную сборку - через тип, который определён в ней, для твоего случая тебе должен помоч такой код
Получив ссылку на сборку ты можешь вызвать у неё метод GetTypes, который возвратит тебе массив объектов Type, для каждого типа, определённого в этой сборке. Дальше массив можно отфильтровать и получить только те типы, которые нужны и преобразовать их в строки(если надо, поскольку в конечном итоге тебе придётся работать с типами, а не со строками. Ну если например надо сохранять в файл, то коллекцию нужных строк можно получить так
Но если этот список нужен только во время исполнения, то лучше хранить в коллекции типы, а не строки
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
||||||||||||||||
|
|||||||||||||||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 6 Всего: 211 |
Добавлено через 27 секунд diadiavova уже ответил |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |