Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как создать экземпляр класса по его имени, Создание экземпляра класса 
V
    Опции темы
emmanuil
Дата 19.4.2007, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: нет
Всего: 3



Можно ли сделать так в C#, чтобы в процедуру в качестве параметра передавать не переменную класса, а сам класс. В Delphi это делается просто:

TMyForm = class(TForm);
TClassOfTMyForm = class of TMyForm;

метод:
procedure MyProc(AMyClass: TClassOfTMyForm)

и сюда можно подавать класс, а не объект, а потом его создавать в процедуре.
Как это сделать в C#. Или как можно создать класс по его названию?
PM MAIL   Вверх
altarvic
Дата 19.4.2007, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 2.3.2007

Репутация: 1
Всего: 1



используй reflection
что-то типа:

Код

object MyProc(Type AMyClass)
{
  ConstructorInfo info = AMyClass.GetConstructor(...);
  return info.invoke(...);
);

}


Отличие от Delphi - в этот метод можно передавать любые классы (через оператор typeof)
а не только производные от TForm

PM MAIL   Вверх
emmanuil
Дата 19.4.2007, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: нет
Всего: 3



Что-то не получается, маловато опыта в C#. Можешь написать пример? Нужно создать экземпляр и потом его испоьзовать, точнее нужно создать много форм.  smile

Добавлено через 12 минут и 3 секунды
Получилось! Спасибо!
делаю так:

        private object MyProc(Type AMyClass)
        {
            ConstructorInfo info = AMyClass.GetConstructor(System.Type.EmptyTypes);
            return info.Invoke(null);
        }

        private void simpleButton1_Click(object sender, EventArgs e)
        {
            Form1 frm;
            frm = (Form1)MyProc(typeof(Form1));
            frm.Show();
        }

Правильно ли я делаю? и правильно ли это вообще? Просто не хотелось бы постоянно преобразовывать!
Есть ли еще способы?
PM MAIL   Вверх
_Dream
Дата 19.4.2007, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 4.11.2006
Где: Там

Репутация: нет
Всего: нет



эм.. а что ты пытаешься сделать и зачем тебе это?
--------------------
Noone dies a virgin. Life screws us all...
PM MAIL ICQ GTalk   Вверх
altarvic
Дата 19.4.2007, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 2.3.2007

Репутация: 1
Всего: 1



Цитата(emmanuil @  19.4.2007,  10:01 Найти цитируемый пост)
Правильно ли я делаю? и правильно ли это вообще? Просто не хотелось бы постоянно преобразовывать!Есть ли еще способы?


Все способы по созданию экземпляра класса по типу класса Type так или иначе будут использовать
reflection. Если у тебя передаваемый класс - это производные от TForm, то преобразование можно делать в самом методе
Код

 private TForm MyProc(Type AMyClass)
{
     ConstructorInfo info = AMyClass.GetConstructor(System.Type.EmptyTypes);
     return (TForm)info.Invoke(null);
}


возвращается общий предок. В этом случае дополнительная функциональность в производных формах должна реализовываться в перекрываемых виртуальных методах.



PM MAIL   Вверх
emmanuil
Дата 19.4.2007, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: нет
Всего: 3



altarvic, спасибо! Я разобрался!  smile 
Получается нелохо!
Дело в том, что у меня есть формы для редактирования справочников. У всех у них есть общий предок - форма. И я хотел написать универсальный создатель этих справочников, чтобы по 10 раз не писать одно и тоже . В универсальный создатель подается еще и тип диалогового окна для редактирования, который в процессе создается, и другие параметры. Вообщем вышло достаточно прилично! Спасибо!

И еще, знает ли кто-нибудь как создать экземпляр по имени класса(string)?
PM MAIL   Вверх
mr.DUDA
Дата 19.4.2007, 13:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(emmanuil @  19.4.2007,  13:48 Найти цитируемый пост)
И еще, знает ли кто-нибудь как создать экземпляр по имени класса(string)?

Код
Type type = Type.GetType ("имя класса");
object экземпляр = Activator.CreateInstance (type);



--------------------
user posted image
PM MAIL WWW   Вверх
emmanuil
Дата 19.4.2007, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: нет
Всего: 3



mr.DUDA, спасибо!
PM MAIL   Вверх
Idsa
Дата 19.4.2007, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



А вообще по этой теме есть неплохая статейка на RSDN:
http://rsdn.ru/article/dotnet/refl.xml#EEFAE


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
emmanuil
Дата 19.4.2007, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

Репутация: нет
Всего: 3



Idsa, спасибо за ссылку!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.2127 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.