Как создавать классы С# во время выполнения и получать к ним доступ во время выполнения?

Пользователь будет предоставлять информацию о схеме во время выполнения, а затем данные, следующие за схемой.

Например:

  • попросил имя класса => Человек.
  • запрашивается количество атрибутов => 2.
  • запрашивается атрибут с типами данных => Имя, строка; Возраст, целое число.

Это должно создать класс на С# как:

class Person
{
    string Name;
    int Age;
}

Затем запросил данные- Abc,25; Деф, 30.

Итак, он создает 2 объекта типа Person.

Класс шаблона уже будет в проекте, атрибуты и данные будут заданы во время выполнения, и в то же время выполнения будут созданы объекты этого класса.

Я пробовал Text Template Transformation Toolkit (T4) и использовал их шаблоны дизайна, но он берет информацию о схеме во время разработки через доступ к файлу конфигурации xml и создает классы. Затем данные передаются во время выполнения.

Можно ли вообще предоставить информацию о схеме во время выполнения?

T4 также имеет шаблоны времени выполнения, но, насколько я понимаю, он генерирует текстовые файлы для использования вне контекста проекта C#, тогда как шаблоны времени разработки можно использовать для предоставления классов C# для использования в том же проекте. Поправьте меня, если я ошибаюсь.


person Sumit Nagpal    schedule 20.06.2019    source источник
comment
Почему вам нужно создавать строго типизированные классы, неизвестные во время компиляции? Возможно лучше подойдут динамические объекты.   -  person eocron    schedule 20.06.2019
comment
@eocron Я не читал о динамических объектах, я буду читать о них. Надеюсь, они решат проблему.   -  person Sumit Nagpal    schedule 20.06.2019
comment
Динамические объекты могут быть решением неправильной проблемы. Первая часть вашего вопроса очень ясна. Предположим, вы сохранили эти входные данные — имя и набор атрибутов. Каждый атрибут имеет имя и тип. Это все хорошо. Совершенно непонятно, почему вы хотите создавать из них классы или что вы хотите делать с этими классами. Класс бесполезен, если другие классы не работают с ним. Но какие классы вы определите для работы с классами, которые не будут существовать до времени выполнения? Даже если это возможно сделать с помощью отражения, вероятно, имеет смысл использовать что-то другое, кроме класса, созданного во время выполнения.   -  person Scott Hannen    schedule 20.06.2019
comment
вы должны посмотреть здесь. это может быть то, что вы ищете: создавать класс динамически   -  person Power Mouse    schedule 20.06.2019


Ответы (2)


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

person Sri Satya Krishna Challa    schedule 20.06.2019

насколько я знаю, вы не можете создать экземпляр такого класса, должен быть определен класс.

но вы можете создать динамический класс (безопасность типов исчезла) и назначить свойства, а затем значения.

вы также можете сгенерировать json и десериализовать его в динамический класс, как в этом ответе

person Bloodday    schedule 20.06.2019
comment
Это возможно. Вы можете взаимодействовать с компилятором (он же JIT) во время выполнения. Но OP, вероятно, просто хочет динамический класс (свойство), как вы упомянули. - person eocron; 20.06.2019
comment
да, я знаю, что вы можете создавать и компилировать код с помощью roselyn или mono , но создание экземпляра класса, который был создан, очень тяжелая работа (mono и roselyn компилируют и запускают код, но область выходит за пределы вашей досягаемости), тогда вам придется используйте отражение, и вы закончите писать 500 строк кода для проблемы, которую можно легко решить другими способами. - person Bloodday; 20.06.2019
comment
Это очень похоже на проблему XY. Динамика может быть ответом, или это может оттолкнуть кого-то от более простого подхода. Всякий раз, когда мы создаем практически что-либо, мы создаем это для того, чтобы что-то вызывало его для достижения какой-то цели. Я думаю, что необходимо понять, что это за цель. Если есть разумная возможность начать с направления решения в сторону безопасного по типам кода, я бы начал с этого и вводил альтернативы только в том случае, если они кажутся абсолютно необходимыми. Чаще всего нужно просто научиться работать с компилятором, а не против него. - person Scott Hannen; 20.06.2019