Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 Generic<T> where T = instance.GetType() КАК?  [new]
WitC
Member

Откуда: Индия
Сообщений: 315
привет!

генерю класс "EntityDataModel" "на лету", из сгенерированного текста.
получаю экземпляр, самого класса в сборке нет:
            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>, т.е.:
var linqTable = System.Data.Linq.Table<myNamespace.EntityDataModel>();


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


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


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

СПАСИБО.
4 окт 17, 12:06    [20841591]     Ответить | Цитировать Сообщить модератору
 Re: Generic<T> where T = instance.GetType() КАК?  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 2421
var linqTable = System.Data.Linq.Table<myNamespace.EntityDataModel>();

в чем проблема сгенерировать точно так же Table<EntityDataModel> ?
4 окт 17, 12:27    [20841696]     Ответить | Цитировать Сообщить модератору
 Re: Generic<T> where T = instance.GetType() КАК?  [new]
WitC
Member

Откуда: Индия
Сообщений: 315
Roman Mejtes
var linqTable = System.Data.Linq.Table<myNamespace.EntityDataModel>();

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


проблема в том, что в режиме разработке этот тип выглядит буквально так (возвращается в виде строки):
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();
        }


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


но как?
4 окт 17, 12:49    [20841777]     Ответить | Цитировать Сообщить модератору
 Re: Generic<T> where T = instance.GetType() КАК?  [new]
WitC
Member

Откуда: Индия
Сообщений: 315
WitC
System.Data.Linq.ITable = DataContext.GetTable(instance.GetType());


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


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


вопрос оставляю открытый.
спасибо.
4 окт 17, 14:12    [20842209]     Ответить | Цитировать Сообщить модератору
 Re: Generic<T> where T = instance.GetType() КАК?  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 2421
если вы динамически в рантайме создаете класс, то создавайте всё остальное так же динамически к нему, так как в не рантайма, его не существует.
Но могут существовать интерфейсы взаимодействия с этим классом, которые будут существовать всегда. А генератор должен определить это наследование.
Тогда тип который был создан в рантайме совершенно не имеет значения. Всё взаимодействие будет через интерфейсы.
4 окт 17, 16:11    [20842742]     Ответить | Цитировать Сообщить модератору
 Re: Generic<T> where T = instance.GetType() КАК?  [new]
hVostt
Member

Откуда:
Сообщений: 11803
WitC
но так не могу использовать linq запросы к набору...


Вы вообще в курсе, что такое статическая типизация?
4 окт 17, 16:13    [20842747]     Ответить | Цитировать Сообщить модератору
 Re: Generic<T> where T = instance.GetType() КАК?  [new]
hVostt
Member

Откуда:
Сообщений: 11803
WitC,

Если вы работаете с типами, известными только во время исполнения, да и вообще с рантайм-структурами, то и выбирать надо подходящие технологии, например DataTable, но уж совершенно точно, не LINQ, который изначально заточен исключительно под статическую типизацию.
4 окт 17, 16:15    [20842759]     Ответить | Цитировать Сообщить модератору
 Re: Generic<T> where T = instance.GetType() КАК?  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 2421
Я не знаю, зачем вы страдает такой хренью.
Но думаю причина этому "лень матушка" :) когда охота быстро и без гемороя нагенерить классы и не писать их ручками.
Если это так, то смотрите в сторону TT файлов (Text Template) в них можно нагенерить все эти классы и они будут статическими и собираться вместе со сборкой.
4 окт 17, 16:49    [20842915]     Ответить | Цитировать Сообщить модератору
 Re: Generic<T> where T = instance.GetType() КАК?  [new]
WitC
Member

Откуда: Индия
Сообщений: 315
Roman Mejtes,

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

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

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

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

теперь, почему не возможно использовать Интерфейс - поля (!) генерятся автоматически, т.е. шаблон структуры изначально не известен...
4 окт 17, 19:35    [20843381]     Ответить | Цитировать Сообщить модератору
 Re: Generic<T> where T = instance.GetType() КАК?  [new]
WitC
Member

Откуда: Индия
Сообщений: 315
hVostt
WitC,

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


согласен, описал выше причину.
заморочился немного, но работает.
4 окт 17, 19:37    [20843387]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить