Мне нужно создать новый интерфейс во время выполнения со всеми теми же элементами, что и существующий интерфейс, за исключением того, что я буду добавлять разные атрибуты для некоторых методов (некоторые из них параметры атрибута неизвестны до времени выполнения). Как это можно достичь?Использование .NET Reflection.Emit для создания интерфейса
7
A
ответ
8
Ваш вопрос не очень конкретный. Если вы обновите его с дополнительной информацией, я подробно расскажу об этом ответе.
Вот краткий обзор предпринятых шагов.
- Создание сборки с DefineDynamicAssembly
- Создать модуль с DefineDynamicModule
- Создать тип с DefineType. Обязательно пройдите
TypeAttributes.Interface
, чтобы сделать свой тип интерфейсом. - Итерируйте элементы в исходном интерфейсе и создайте аналогичные методы в новом интерфейсе, применяя при необходимости атрибуты.
- Позвоните
TypeBuilder.CreateType
, чтобы завершить строительство вашего интерфейса.
12
Для динамического создания сборки с интерфейсом, который имеет атрибуты:
using System.Reflection;
using System.Reflection.Emit;
// Need the output the assembly to a specific directory
string outputdir = "F:\\tmp\\";
string fname = "Hello.World.dll";
// Define the assembly name
AssemblyName bAssemblyName = new AssemblyName();
bAssemblyName.Name = "Hello.World";
bAssemblyName.Version = new system.Version(1,2,3,4);
// Define the new assembly and module
AssemblyBuilder bAssembly = System.AppDomain.CurrentDomain.DefineDynamicAssembly(bAssemblyName, AssemblyBuilderAccess.Save, outputdir);
ModuleBuilder bModule = bAssembly.DefineDynamicModule(fname, true);
TypeBuilder tInterface = bModule.DefineType("IFoo", TypeAttributes.Interface | TypeAttributes.Public);
ConstructorInfo con = typeof(FunAttribute).GetConstructor(new Type[] { typeof(string) });
CustomAttributeBuilder cab = new CustomAttributeBuilder(con, new object[] { "Hello" });
tInterface.SetCustomAttribute(cab);
Type tInt = tInterface.CreateType();
bAssembly.Save(fname);
Это создает следующее:
namespace Hello.World
{
[Fun("Hello")]
public interface IFoo
{}
}
методы Добавление использовать класс MethodBuilder по телефону TypeBuilder.DefineMethod.
Смежные вопросы
- 1. Использование Reflection.Emit для реализации общего интерфейса
- 2. Рамка для .net Reflection.Emit упрощение?
- 3. Reflection.Emit для динамического создания метода
- 4. Использование Reflection.Emit реализовать интерфейс
- 5. Использование Dynamic или Reflection.emit
- 6. Явная реализация интерфейса и Reflection.Emit
- 7. Использование Reflection.Emit для испускания «использования (x) {...}" блока?
- 8. Использование библиотеки чертежей для создания графического интерфейса
- 9. Использование основных приложений для создания пользовательского интерфейса
- 10. Reflection.Emit Performance
- 11. Использование Reflection.Emit для установки значения свойства
- 12. Использование Reflection.Emit для генерации дискриминационных объединений
- 13. Использование .net-интерфейса в matlab
- 14. Использования Reflection.Emit для создания экземпляра универсального типа с Generic Параметры
- 15. Снижение производительности Reflection.Emit
- 16. Альтернативы Reflection.Emit для Compact Framework
- 17. . NET: клонировать существующий метод динамически с Reflection.Emit
- 18. У компиляторов .NET (например, csc.exe, vbc.exe) используется Reflection.Emit()?
- 19. Реализация INotifyPropertyChanged с Reflection.Emit
- 20. Использование Reflection.Emit, чтобы соответствовать существующий конструктор
- 21. Использование метода интерфейса интерфейса
- 22. Каково использование интерфейса IClonable в .NET?
- 23. Использование COM-интерфейса в C# .net
- 24. Инструменты для создания пользовательского интерфейса
- 25. Инструмент для создания пользовательского интерфейса
- 26. Использование интерфейса iPhone touch и drag для интуитивного создания списка
- 27. Использование типа интерфейса для создания объекта класса, реализующего интерфейс
- 28. Использование ввода для создания пользовательского интерфейса в Shiny R
- 29. Использование Leiningen для создания интерфейса с помощью Gulp
- 30. Использование wxFormbuilder для создания графического интерфейса и Tab_Traversal не работает
Нет, это круто. Мне не нужно было использовать Reflection.Emit раньше, поэтому просто хотел посмотреть, сможет ли кто-нибудь обнаружить камень преткновения в моем злобном генеральном плане. –