Использование .Отражение СЕТИ.Излучение для создания интерфейса

StackOverflow https://stackoverflow.com/questions/136528

  •  02-07-2019
  •  | 
  •  

Вопрос

Мне нужно сгенерировать новый интерфейс во время выполнения со всеми теми же элементами, что и у существующего интерфейса, за исключением того, что я буду добавлять разные атрибуты к некоторым методам (некоторые параметры атрибута неизвестны до времени выполнения).Как этого можно достичь?

Это было полезно?

Решение

Ваш вопрос не очень конкретен.Если вы обновите его дополнительной информацией, я дополню этот ответ дополнительными деталями.

Вот обзор выполняемых вручную действий.

  1. Создайте сборку с помощью DefineDynamicAssembly
  2. Создайте модуль с помощью DefineDynamicModule
  3. Создайте тип с помощью DefineType .Обязательно передайте TypeAttributes.Interface чтобы сделать ваш тип интерфейсом.
  4. Выполните итерацию по элементам в исходном интерфейсе и создайте аналогичные методы в новом интерфейсе, применяя атрибуты по мере необходимости.
  5. Звонить 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 .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top