Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 25.01.2010
Сообщений: 7

System.Reflection.Emit -> конструктор неправильный

14.07.2010, 20:23. Показов 1722. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне необходимо налету создать класс, проинициализировать поля (значения приходят) и поместить этот класс в PropertyGrid.
Вот процедура которая создает класс. Ошибка в конструкторе.. Помогите пожалуйста, нужно проинициализировать в конструктор все создаваемые в "foreach" поля

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
61
62
63
64
65
66
67
68
69
70
71
72
// Создаём сборку
            AppDomain Domain = System.Threading.Thread.GetDomain();
            AssemblyName AsmName = new AssemblyName();
            AsmName.Name = "DynamicAssembly";
 
            // To generate a persistable assembly, specify AssemblyBuilderAccess.RunAndSave.
            AssemblyBuilder AsmBuilder = Domain.DefineDynamicAssembly(AsmName,
                                                            AssemblyBuilderAccess.RunAndSave, @"c:\");//Path.GetTempPath());
 
            // Generate a persistable single-module assembly.
            ModuleBuilder ModBuilder =
                AsmBuilder.DefineDynamicModule(AsmName.Name, AsmName.Name + ".dll");
 
 
            // Прокси-класс
            TypeBuilder TypeBuilder = ModBuilder.DefineType("PropertyClass", TypeAttributes.Public | TypeAttributes.Class);
 
            List<Type> ctorParams = new List<Type>();
            List<FieldBuilder> fields = new List<FieldBuilder>();
 
            foreach (RParam param in args)
            {
                ctorParams.Add(param.RType);
                //Приватное поле
                FieldBuilder FieldBldr = TypeBuilder.DefineField(param.Name.ToLower(),
                                                            param.RType,
                                                            FieldAttributes.Private);
                fields.Add(FieldBldr);
                
                //Свойство
                PropertyBuilder PropertyBldr = TypeBuilder.DefineProperty(param.Name,
                                                             PropertyAttributes.HasDefault,
                                                             param.RType,//typeof(String),
                                                             null);
                //Атрибуты Геттера
                MethodAttributes getSetAttr = MethodAttributes.Public | MethodAttributes.SpecialName |
                                                MethodAttributes.HideBySig;
                // Геттер
                MethodBuilder Get = TypeBuilder.DefineMethod("Get_" + param.Name, getSetAttr,
                                                                typeof(string), Type.EmptyTypes);
                ILGenerator GetFld = Get.GetILGenerator();
                GetFld.Emit(OpCodes.Ldarg_0);
                GetFld.Emit(OpCodes.Ldfld, FieldBldr);
                GetFld.Emit(OpCodes.Ret);
 
                //Сеттер
                MethodBuilder Set = TypeBuilder.DefineMethod("Set_" + param.Name,
                                                                    getSetAttr, null,
                                                                    new Type[] { param.RType });
                ILGenerator SetFld = Set.GetILGenerator();
 
                SetFld.Emit(OpCodes.Ldarg_0);
                SetFld.Emit(OpCodes.Ldarg_1);
                SetFld.Emit(OpCodes.Stfld, FieldBldr);
                SetFld.Emit(OpCodes.Ret);
 
                PropertyBldr.SetGetMethod(Get);
                PropertyBldr.SetSetMethod(Set);
            }
 
            // Конструктор прокси-класса.
            ConstructorBuilder pointCtor = TypeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, ctorParams.ToArray());
            ILGenerator ilgen = pointCtor.GetILGenerator();
 
            ILGenerator ctorIL = pointCtor.GetILGenerator();
            ctorIL.Emit(OpCodes.Ldarg_0);
            ctorIL.Emit(OpCodes.Call, typeof(object).GetConstructor(new Type[0]));
            ctorIL.Emit(OpCodes.Ret);
 
 
            Type type = TypeBuilder.CreateType();
            return Activator.CreateInstance(type, new object[] {  });
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.07.2010, 20:23
Ответы с готовыми решениями:

Как создать .exe? (System.Reflection.Emit)
как создать .exe через System.Reflection.Emit?

Emit, Reflection, кодогенерация
Допустим у вас есть некий клиент, который может отправлять сообщения, при этом для отправки ему нужны айдишник сообщения и контент. ...

Как задать атрибут для генерируемого класса, используя Reflection.Emit?
Я пишу код, который должен сгенерировать следующий класс в рантайме, используя System.Reflection.Emit: public class GeneratedClass {...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.07.2010, 20:23
Помогаю со студенческими работами здесь

Необработанное исключение типа "System.Reflection.TargetInvocationException"
Добрых времени суток. Есть асинхронный сервер, к которому подулючается клиент, передает на серв данные и должен получить в ответ...

System reflection
Как с помощью System reflection добавить поле в класс?

О производительности System.Reflection
Приветствую. Читал как-то что результаты рефлексии кешируются. Есть необходимость обращаться к классу в пространстве имен, но...

Исключения и System.Reflection
В общем возникает исключение при компиляции,не пойму почему. Исключение - индекс находится вне границ массива,строка 77 using...

Reflection. Как вызвать конструктор и метод в Main'e?
Доброго всем времени суток. уже 2ой пытаюсь разобраться с reflection, перечитал кучу инфы, пересмотрел много примеров, но так и не смог...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru