Использование .Отражение СЕТИ.Излучение для создания интерфейса
-
02-07-2019 - |
Вопрос
Мне нужно сгенерировать новый интерфейс во время выполнения со всеми теми же элементами, что и у существующего интерфейса, за исключением того, что я буду добавлять разные атрибуты к некоторым методам (некоторые параметры атрибута неизвестны до времени выполнения).Как этого можно достичь?
Решение
Ваш вопрос не очень конкретен.Если вы обновите его дополнительной информацией, я дополню этот ответ дополнительными деталями.
Вот обзор выполняемых вручную действий.
- Создайте сборку с помощью DefineDynamicAssembly
- Создайте модуль с помощью DefineDynamicModule
- Создайте тип с помощью DefineType .Обязательно передайте
TypeAttributes.Interface
чтобы сделать ваш тип интерфейсом. - Выполните итерацию по элементам в исходном интерфейсе и создайте аналогичные методы в новом интерфейсе, применяя атрибуты по мере необходимости.
- Звонить
TypeBuilder.CreateType
чтобы закончить создание вашего интерфейса.
Другие советы
Для динамического создания сборки с интерфейсом, имеющим атрибуты:
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 .
Не связан с StackOverflow