Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 05.07.2021
Сообщений: 9
.NET 4.x

Реализация generic класса и метода(в зависимости от передаваемого типа(другого класса)

27.07.2021, 07:39. Показов 2114. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задание:
Создать generic класс что позволяет в зависимости переданного типа (другого класса) создать файл с расширением cs где будет содержаться код под названием переданного класса и его свойствами. Нужно использовать Reflection и generic классы.
Пример созданого файла:

class Human
{
public int Age {get; set;}
public string Address {get;}
public double Salary {get; private set;}
}


Пробую делать уже не первый день, хотел спросить, у кого какие мысли по этому поводу? Как передать другой класс?
Ясен пень что в foreach (PropertyInfo info in property_infos), что-то делаю неправильно... может кто сталкивался, буду благодраен.

C#
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
 
namespace try3
{
    class Human<T> //универсальный клас <T>-тип подставился сюда
    {
        public T Age { get; set; }// и свойство стало инт
        public T Address { get; }
        public T Salary { get; private set; }
        public void GetType()
        {
            /*Console.WriteLine(Age.GetType());//возвращает тип*/
        }
        public void GetTypeMethod<Human>(T parametr) //метод переданого типа(другого класа нужен универсальный)
        {
            return;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //Вывод имени класов
            Assembly assembly = Assembly.GetExecutingAssembly();
            Type[] assemblyTypes = assembly.GetTypes();
            foreach (Type t in assemblyTypes)
                Console.WriteLine(t.Name);
            Console.ReadKey();
 
 
            Type myType = typeof(Human<>);
 
            PropertyInfo[] property_infos = myType.GetProperties(
                BindingFlags.Instance |
                BindingFlags.NonPublic |
                BindingFlags.Public);
            Console.WriteLine("Властивості class " + myType.Name);
            Console.WriteLine("{");
            foreach (PropertyInfo info in property_infos)
            {
                string name = info.Name;
                string attributes = "";
                string value = "";
                if (info.PropertyType.IsPublic) value += "public ";
                if (info.PropertyType.IsNotPublic) value += "private ";
                if (info.CanRead) attributes += "{get;";
                if (info.CanWrite) attributes += "set;}";
                Console.WriteLine($"{value} {info.Name} {attributes}");
            }
            Console.WriteLine("}");
            Console.ReadLine();
        }
 
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.07.2021, 07:39
Ответы с готовыми решениями:

Как вызвать из одного класса (для метода типа void) метод типа boolean другого класса?
ребят, только учусь и конечно, вопросов возникает много. ситуация вот в чем. есть массив. я должна найти в i-том элементе какую-то...

Работа метода класса в зависимости от типа объекта класса
есть такой код: template &lt;typename __Type, size_t __m&gt; class mvector { private: __Type _m; ...

Обработка метода класса в зависимости от типа данного класса
Имеется класс родителя A с методом Update(), этот класс имеет 2 дочерних класса B, C, каждый из них имеет свой метод обработки Update:...

3
 Аватар для lovember
152 / 100 / 40
Регистрация: 14.10.2016
Сообщений: 379
27.07.2021, 11:09
В том виде, как у вас составлен класс Human<T>, его свойства будут того типа, который будет указан при создании экземпляра класса. Я имею в виду эту часть:
C#
1
2
3
4
5
6
7
8
9
10
11
 class Human<T> //универсальный клас <T>-тип подставился сюда
    {
        public T Age { get; set; }// и свойство стало инт
        public T Address { get; }
        public T Salary { get; private set; }
        public void GetType()
        {
            /*Console.WriteLine(Age.GetType());//возвращает тип*/
        }
    // остальной код
    }
Свойство Age станет int только если вы создадите экземпляр var human = new Human<int>();
Но тогда свойства Address и Salary также будут типа int

Добавлено через 31 минуту
Если вам нужен метод, считывающий свойства другого типа, то, видимо, можно сделать что-то вроде (не проверял, писал без студии):
C#
1
2
3
4
public PropertyInfo[] GetOtherClassProperties(T parameter)
{
    return typeof(parameter).GetProperties();
}
либо, зная имя класса, просто использовать в Main:
C#
1
2
PropertyInfo[] myPropertyInfo;
myPropertyInfo = Type.GetType("TypeName").GetProperties();
Последнее взято отсюда и немного изменено.
1
0 / 0 / 0
Регистрация: 05.07.2021
Сообщений: 9
27.07.2021, 19:29  [ТС]
Это круто что вы помогли, но по сути, не понимаю...
Ладно бы рефлексия просто, да еще и generic создавай(а я с ним ни разу не работал)
0
 Аватар для lovember
152 / 100 / 40
Регистрация: 14.10.2016
Сообщений: 379
27.07.2021, 20:25
Цитата Сообщение от toxics Посмотреть сообщение
но по сути, не понимаю...
Вы получаете массив свойств класса, зная его имя:
C#
1
2
PropertyInfo[] properties;
properties = Type.GetType("ClassName").GetProperties();
В переменной properties будет набор свойств класса ClassName.
Далее можно её использовать, чтобы
Цитата Сообщение от toxics Посмотреть сообщение
создать файл с расширением cs где будет содержаться код под названием переданного класса и его свойствами.
Т.е. просто текстовый файл с расширением cs.
Полагаю с последним вы можете справиться. Да и код для обработки массива у вас уже в общем-то есть (строки 44-54).
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.07.2021, 20:25
Помогаю со студенческими работами здесь

Передача метода класса в качестве параметра для метода другого класса
Здравствуйте, Передо мной стоит такая задача. Необходимо разработать механизм, который бы мог прервать любую функцию, при этом абсолютна...

Передача значения переменной из метода одного класса в метод другого класса
Добрый вечер! Есть основная форма Form1 в которой есть метод private void button1_Click(object sender, EventArgs e) обрабатывающий...

Экземпляр класса как входные данные метода другого класса
Можно ли в качестве входных данных метода передать экземпляр метода другого класса? Если да, то как?

Что-то я не понимаю.Вызов метода одного класса из другого класса
Есть два класса первый содержит атрибуты объекта описывающие кнопку: имя, позиция, размер и тд... А так же содержит набор методов для...

Ошибка при вызове метода класса в методе другого класса
Господа программисты, возникла такая проблема. При вызове метода класса в методе другого класса выходит такая ошибка &quot; нестандартный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru