powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Generic<T> where T = instance.GetType() КАК?
10 сообщений из 10, страница 1 из 1
Generic<T> where T = instance.GetType() КАК?
    #39530670
WitC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
привет!

генерю класс "EntityDataModel" "на лету", из сгенерированного текста.
получаю экземпляр, самого класса в сборке нет:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
            var providert = CodeDomProvider.CreateProvider("CSharp");
            var compilerParams = new CompilerParameters() { GenerateExecutable = false, GenerateInMemory = true };
            compilerParams.ReferencedAssemblies.AddRange(new[] { "System.dll",
                                                                 "System.Data.Linq.dll",
                                                                 Assembly.GetExecutingAssembly().Location });
            CompilerResults results = providert.CompileAssemblyFromSource(compilerParams, GetCode(settingsData));

            object instance = results.CompiledAssembly.CreateInstance("myNamespace.EntityDataModel");



требуется получить таблицу System.Data.Linq.Table<T>, т.е.:
Код: c#
1.
var linqTable = System.Data.Linq.Table<myNamespace.EntityDataModel>();



но данного типа: myNamespace.EntityDataModel в режиме разработки просто нет...
можно ли как-то сгенерить таблицу объектов с нужным типом, что-то типа этого:
Код: c#
1.
var linqTable = System.Data.Linq.Table<instance.GetType()>();



пока выкрутился через System.Data.Linq.ITable
Код: c#
1.
System.Data.Linq.ITable = DataContext.GetTable(instance.GetType());



но так не могу использовать linq запросы к набору...

СПАСИБО.
...
Рейтинг: 0 / 0
Generic<T> where T = instance.GetType() КАК?
    #39530691
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
var linqTable = System.Data.Linq.Table<myNamespace.EntityDataModel>();

в чем проблема сгенерировать точно так же Table<EntityDataModel> ?
...
Рейтинг: 0 / 0
Generic<T> where T = instance.GetType() КАК?
    #39530707
WitC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtesvar linqTable = System.Data.Linq.Table<myNamespace.EntityDataModel>();

в чем проблема сгенерировать точно так же Table<EntityDataModel> ?

проблема в том, что в режиме разработке этот тип выглядит буквально так (возвращается в виде строки):
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
private string GetCode(ISettingsData settingsData)
        {
            var sb = new StringBuilder();
            sb.AppendLine("using System;");
            sb.AppendLine("using System.ComponentModel;");
            sb.AppendLine("using System.Data.Linq.Mapping;");
            sb.AppendLine("namespace myNamespace.EntityModel");
            sb.AppendLine("{ //namespace");
            sb.AppendFormat("[Table(Name = \"{0}\")]", settingsData.TableName);
            sb.AppendLine("public class EntityDataModel");
            sb.AppendLine("{ //class");
            var properties = GetProperties(settingsData);
            foreach (var prop in properties)
            {
                sb.AppendLine(prop);
            }
            sb.AppendLine("} //class");
            sb.AppendLine("} //namespace");
            return sb.ToString();
        }



т.е. он существует только в режиме работы приложения....
мне надо тип вывести из экземпляра... или достать тип из объектов:
Код: c#
1.
2.
CodeDomProvider
CompilerResults 



но как?
...
Рейтинг: 0 / 0
Generic<T> where T = instance.GetType() КАК?
    #39530753
WitC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WitC
Код: c#
1.
System.Data.Linq.ITable = DataContext.GetTable(instance.GetType());



но так не могу использовать linq запросы к набору...
СПАСИБО.

к типу не привёл...
в общем все мы от object.
Код: c#
1.
System.Data.Linq.ITable table = DataContext.GetTable(instance.GetType()).OfType<object>().Skip(10).Take(5);



вопрос оставляю открытый.
спасибо.
...
Рейтинг: 0 / 0
Generic<T> where T = instance.GetType() КАК?
    #39530892
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если вы динамически в рантайме создаете класс, то создавайте всё остальное так же динамически к нему, так как в не рантайма, его не существует.
Но могут существовать интерфейсы взаимодействия с этим классом, которые будут существовать всегда. А генератор должен определить это наследование.
Тогда тип который был создан в рантайме совершенно не имеет значения. Всё взаимодействие будет через интерфейсы.
...
Рейтинг: 0 / 0
Generic<T> where T = instance.GetType() КАК?
    #39530895
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WitCно так не могу использовать linq запросы к набору...

Вы вообще в курсе, что такое статическая типизация?
...
Рейтинг: 0 / 0
Generic<T> where T = instance.GetType() КАК?
    #39530901
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WitC,

Если вы работаете с типами, известными только во время исполнения, да и вообще с рантайм-структурами, то и выбирать надо подходящие технологии, например DataTable, но уж совершенно точно, не LINQ, который изначально заточен исключительно под статическую типизацию.
...
Рейтинг: 0 / 0
Generic<T> where T = instance.GetType() КАК?
    #39530950
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не знаю, зачем вы страдает такой хренью.
Но думаю причина этому "лень матушка" :) когда охота быстро и без гемороя нагенерить классы и не писать их ручками.
Если это так, то смотрите в сторону TT файлов (Text Template) в них можно нагенерить все эти классы и они будут статическими и собираться вместе со сборкой.
...
Рейтинг: 0 / 0
Generic<T> where T = instance.GetType() КАК?
    #39531067
WitC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,

всё верно, интерфейсы - самый идеальный вариант, он отпал первым. :)

Для начала уточню задачу, не сделал этого в самом начале.
Требуется постранично выводить данные в ДатаГридВиев и подрубаться к любой таблице, в любой указанной БД,
в настроечном файле приложения.

самый простой вариант ДатаТайбл/ДатаСэт + ДБФактори.
в этом случае, для страничной загрузки, необходимо заворачивать таблицу в запросы с подсчётом строк,
генерить критерии для Бетвина, и это не смотря на то, что запросы в разные БД будут, мягко сказать, различаться...

от сюда, выбрал следующую схему:
Линкью - управляем данными и диапазонами.
АДО - тянем структуру таблицы, например как ДатаРиадер.ГетТайблСхема (примерно...)
из этой структуры создаём динамический класс, с названиями и типами полей, указанными в схеме...
генерим класс, отдаём Линкью - УРА. В итоге, этот вариант уже работает.

теперь, почему не возможно использовать Интерфейс - поля (!) генерятся автоматически, т.е. шаблон структуры изначально не известен...
...
Рейтинг: 0 / 0
Generic<T> where T = instance.GetType() КАК?
    #39531069
WitC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttWitC,

Если вы работаете с типами, известными только во время исполнения, да и вообще с рантайм-структурами, то и выбирать надо подходящие технологии, например DataTable , но уж совершенно точно, не LINQ, который изначально заточен исключительно под статическую типизацию.

согласен, описал выше причину.
заморочился немного, но работает.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Generic<T> where T = instance.GetType() КАК?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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