powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как в С# использовать метаклассы?
12 сообщений из 12, страница 1 из 1
Как в С# использовать метаклассы?
    #32889241
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет. Задача такая: создать метод, параметром которого будет тип данных (класс) и внутри этого метода создать экземпляр переданного класса.

Для примера привожу как схематически я это делал на паскале:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
 type  
   // базовый класс 
  TMyForm= class (TForm)
     constructor  Create(...);    
    ...
   end ;
   // наследник базового класса 
  TMyConcrateForm= class (TMyForm)
    ...
   end ;
   // метакласс базового класса 
  TMyFormClass= class   of  TMyForm;

...

 // метод, создающий экземпляр любого наследника базового класса 
 procedure  CreateMyForm(FormClass:TMyFormClass);
 var 
  Form:TMyform;
 begin 
  Form:=FormClass.Create(...);
  ...
 end ;

 begin 
 // создание наследника класса 
  CreateMyForm(TMyConcrateClass);
...
Рейтинг: 0 / 0
Как в С# использовать метаклассы?
    #32889287
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я так думаю нужно передавать тип класса, а потом через Activator например созать инстанс, но в отличии от паскаля ты не можешь нормально увидеть какие параметры требует конструктор, тобишь нужно будет знать их..

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class MyClass
{
  MyClass(int param1)
  {
  }
}

void Test(Type classType)
{ 
  object  obj = Activator.CreateInstance( classType, ..)
  ....
}
...
Рейтинг: 0 / 0
Как в С# использовать метаклассы?
    #32889302
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а ну и использовать так:
Код: plaintext
1.
 Test(gettype(MyClass))
...
Рейтинг: 0 / 0
Как в С# использовать метаклассы?
    #32889354
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо - попробую!
...
Рейтинг: 0 / 0
Как в С# использовать метаклассы?
    #32891948
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лиман Артёмно в отличии от паскаля ты не можешь нормально увидеть какие параметры требует конструктор, тобишь нужно будет знать их..

Не надо человека вводить в заблуждение. Класс Type содержит все необходимое для получения полного набора метаданных о классе - собственно именно для этого он и существует. В том числе и параметров, передаваемых конструктору.
Лиман Артём
Test(gettype(MyClass))

Что такое "gettype" ?? Может все таки
Код: plaintext
 Test(typeof(MyClass)) 

--
WBR, Roman S. Golubin
...
Рейтинг: 0 / 0
Как в С# использовать метаклассы?
    #32892021
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman S. Golubin
Не надо человека вводить в заблуждение. Класс Type содержит все необходимое для получения полного набора метаданных о классе - собственно именно для этого он и существует. В том числе и параметров, передаваемых конструктору.


никто никого не вводит в заблуждение!
при вызове FormClass.Create будут подсвечены необходимые для конструктора параметры, а метаданные нужно еще получить..

Roman S. Golubin
Что такое "gettype" ?? Может все таки
Код: plaintext
 Test(typeof(MyClass)) 


ну да, gettype это из васика, ну ошибся - даже на солнце есть пятна)
...
Рейтинг: 0 / 0
Как в С# использовать метаклассы?
    #32892233
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лиман Артёмпри вызове FormClass.Create будут подсвечены необходимые для конструктора параметры, а метаданные нужно еще получить..

Ключевое слово:
Лиман Артём... тобишь нужно будет знать их..
И скажи после этого, как же "при вызове FormClass.Create будут подсвечены необходимые параметры", если ты их даже не знаешь? И что вообще означает слово "подсвечены" применительно, например, к блокноту? :-))

И чем тогда не устраивает конструктор с набором _известных_ параметров и приведением созданного экземпляра к базовому классу?
Код: plaintext
MyClassBase instance = (MyClassBase)Activator.CreateInstance( type, new object[] { ... } );

--
WBR, Roman S. Golubin

PS:
Лиман Артёмну да, gettype это из васика, ну ошибся - даже на солнце есть пятна)
Все мы люди, все мы человеки и ни кто тебе это в вину не ставит :-))))
...
Рейтинг: 0 / 0
Как в С# использовать метаклассы?
    #32892331
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman S. Golubin Лиман Артёмпри вызове FormClass.Create будут подсвечены необходимые для конструктора параметры, а метаданные нужно еще получить..

Ключевое слово:
Лиман Артём... тобишь нужно будет знать их..
И скажи после этого, как же "при вызове FormClass.Create будут подсвечены необходимые параметры", если ты их даже не знаешь? И что вообще означает слово "подсвечены" применительно, например, к блокноту? :-))

И чем тогда не устраивает конструктор с набором _известных_ параметров и приведением созданного экземпляра к базовому классу?
Код: plaintext
MyClassBase instance = (MyClassBase)Activator.CreateInstance( type, new object[] { ... } );

я имею ввиду, что при передаче в паскале типа класса, при вызове Type.Create интелисенс покажет какие параметры принимает конструктор.
при использовании Activatora эти параметры не показываются, нужно просто знать что они есть
...
Рейтинг: 0 / 0
Как в С# использовать метаклассы?
    #32892420
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё вопрос по поводу кода:
Код: plaintext
1.
2.
3.
4.
void Test(Type classType)
{ 
  object  obj = Activator.CreateInstance( classType, ..)
  ....
}

Здесь в метод Test можно передать любой класс. Как сделать чтобы параметр classType мог принимать только определённые классы, например только TMyForm и его наследников?
...
Рейтинг: 0 / 0
Как в С# использовать метаклассы?
    #32892470
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void Test(Type classType)
{ 
   if (!classType.IsSubclassOf(typeof(BaseType))) throw new Exception();
  object  obj = Activator.CreateInstance( classType, ..)
  ....
}

...
Рейтинг: 0 / 0
Как в С# использовать метаклассы?
    #32892692
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я уже так сделал как вы написали.
Мне интересно можно ли это на этапе компилляции сделать?
...
Рейтинг: 0 / 0
Как в С# использовать метаклассы?
    #32892805
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
думаю никак, только если параметр будет конкретного типа
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как в С# использовать метаклассы?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]