@gleb_kudr

Динамическое объявление типа в C#

Приветствую!

Вот уж не знал, что докачусь до таких извращений.

У меня есть таблица Column1; Column2; Column3 и т.д. Число колонок динамическое по-определению.

Мне надо сделать так, чтобы все это присутствовало в программе в виде массива с элементами, которые содержат названия колонок как поля класса (важно, именно поля, не массив и ничто другое). Для примера привел анонимный вызов подобной штуки

[] {Column1=foo1, Column2=foo2, Column3=foo3 etc...}


Внимание, вопрос: как сделать с учетом динамической сущности таблицы? Я не знаю, сколько колонок будет, а хардкодить про запас 100500 полей/методов это идиотизм.

Например, подошло бы преобразование из строковой переменной в вызов анонимного типа. Или какой-нибудь «массив методов»? У меня фантазия уже заканчивается :)

Вообще, можно ли такое сделать на c#? На первый взгляд, очень неподходящий язык для этого.
  • Вопрос задан
  • 4315 просмотров
Пригласить эксперта
Ответы на вопрос 3
ganouver
@ganouver
Можно попробовать использовать генерацию кода класса на основе просто перечисления названий полей с типами (а то и сразу на основе структуры таблицы в БД), например, с помощью t4 text templates.
Шаблон класса нужно будет написать один раз, в дальнейшем он будет обновляться при сборке.
Этот способ не работает, если структура таблицы изменится после компиляции программы.
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Если тип данных для вашего поля будет object — то вы можете спокойно засылать туда что угодно, хоть буль хоть доубл. Информация о типе объекта сохраняется, так что вы в любой момент можете узнать что у вас за тип. Касательно количества колонок — тут уже очень много вариантов. Нужно более конкретно указать что именно хотите получить в итоге? Пример работы с данными внутри и снаружи, так сказать.
Ответ написан
@gleb_kudr Автор вопроса
Есть контрол www.devexpress.com/Products/NET/Controls/WPF/Grid/tree.xml который понимает на вход только такое специфическое представление данных. Именно поэтому оно мне нужно в таком странном виде.

Код примерно вот такой (ну куча обвязки вокруг, но это не имеет значения)

//формируем коллекцию используя БД и SQL команду
TreeViewSQLiteDataCollection collection= new TreeViewSQLiteDataCollection (sqLiteCommandString, sqLiteConnection);

//это вызывается в коде TreeViewSQLiteDataCollection для того чтобы наполнить коллекцию из открытого датаридера
this.Add(new { path = sqlReader.GetString(0), parent_ID = sqlReader.GetString(1), ShowID = sqlReader.GetString(0), description = sqlReader.GetInt32(2) });

//привязываем коллекцию к контролу
treeListControl1.ItemsSource = collection;


Тип поля object это все отлично понятно и распарсить я бы его мог с удовольствием, только вот такой тип поля не будет отображаться в контроле, он понимает только те типы, на которые действует .ToString
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы