Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Эксперт .NET
1846 / 1353 / 428
Регистрация: 10.06.2011
Сообщений: 2,128
1

Как задать атрибут для генерируемого класса, используя Reflection.Emit?

11.11.2019, 23:58. Показов 1058. Ответов 2

Author24 — интернет-сервис помощи студентам
Я пишу код, который должен сгенерировать следующий класс в рантайме, используя System.Reflection.Emit:
C#
1
2
3
4
[DefiniteAttribute]
public class GeneratedClass
{
}
Мой текущий код:
C#
1
2
3
public class DefiniteAttribute : Attribute
{
}

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var assemblyName = new AssemblyName("GeneratedAssembly");
var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName(assemblyName.Name), AssemblyBuilderAccess.Run);
var moduleBuilder = assemblyBuilder.DefineDynamicModule("GeneratedModule");
var typeBuilder = moduleBuilder.DefineType("GeneratedClass",
                                           TypeAttributes.Public
                                           | TypeAttributes.Class
                                           | TypeAttributes.AutoClass
                                           | TypeAttributes.AnsiClass
                                           | TypeAttributes.BeforeFieldInit
                                           | TypeAttributes.AutoLayout, null);
var constructorInfo = typeof(DefiniteAttribute).GetConstructor(new Type[0]);
var customAttributeBuilder = new CustomAttributeBuilder(constructorInfo, new object[0]);
typeBuilder.SetCustomAttribute(customAttributeBuilder);
Type generatedType = typeBuilder.CreateType();
 
var definiteAttribute = (DefiniteAttribute) generatedType.GetCustomAttribute(typeof(DefiniteAttribute), false);
Класс GeneratedClass генерируется успешно. Но атрибут DefiniteAttribute не устанавливается для него (переменная definiteAttribute равна null)

Подскажите, пожалуйста, как следует исправить код, чтобы атрибут устанавливался для генерируемого класса?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.11.2019, 23:58
Ответы с готовыми решениями:

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

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

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

Аналог CodeDom и System.Reflection.Emit
собсна сабж. в шарпе есть пространства имен - System.CodeDom и System.Reflection.Emit. интересует,...

2
Администратор
Эксперт .NET
17553 / 13776 / 5298
Регистрация: 17.03.2014
Сообщений: 28,253
Записей в блоге: 1
12.11.2019, 00:27 2
novikov.ea, у меня данный код отрабатывает без ошибок. Переменная definiteAttribute не равна null.
0
Эксперт .NET
1846 / 1353 / 428
Регистрация: 10.06.2011
Сообщений: 2,128
12.11.2019, 12:05  [ТС] 3
Прошу прощения, я неправильно записал код. Модификатор доступа для DefiniteAttribute должен быть internal.
C#
1
2
3
internal class DefiniteAttribute : Attribute
{
}
Атрибут действительно задаётся для класса, а вот извлечь его методом GetCustomAttribute не получается.
Я смог определить наличие атрибута с помощью метода GetCustomAttributesData:
C#
1
var definiteAttributeData = generatedType.GetCustomAttributesData().FirstOrDefault(x => x.AttributeType == typeof(DefiniteAttribute));
Добавлено через 12 минут
Оказывается, если задать inherit=true, то internal атрибут возвращается методом GetCustomAttribute
C#
1
var definiteAttribute =  generatedType.GetCustomAttribute<DefiniteAttribute>(inherit: true);
Хотя в документации указано лишь
Код
inherit: true to inspect the ancestors of element; otherwise, false.
0
12.11.2019, 12:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.11.2019, 12:05
Помогаю со студенческими работами здесь

Как задать значения статического поля класса используя рефлексию?
Народ как задать значение статическому полю класса при помощи рефлексии. Есть тема...

Атрибуты класса в ООП. Как сделать атрибут одним для всех экземпляров?
Доброго времени суток. Возник вопрос как реализовать такой момент. Я пишу консольного дурака на ООП...

Xsl преобразованием(как задать необязательный атрибут)
Необходимо преобразовать необязательный атрибут. Возьмём часть xml-документа: &lt;catalog&gt; ...

Как задать значение по умолчанию для свойства класса
Где и как можно сохранять и считывать значения свойств класса. Помню - такая возможность есть - но...

Какой необходимо указать атрибут для проперти класса?
Вопрос: какой необходимо указать атрибут для проперти класса, чтоб когда к ней подводишь мышку,...

CodeFirst, как для поля класса задать auto incriment
Entuty Framework. Подход CodeFirst. Как для поля класса задать auto incriment? Можно пример?


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru