Используя Отражение.NET. Испустите для генерации интерфейса

у вас есть 2 варианта:

  • изменить входной аргумент
  • вернуть x вместе с d

Изменение входного аргумента может укусить Вы позже, когда вы хотите проверить оригинальную версию x или что-то уже имеет ссылку на оригинал, и вы изменили его.

Я бы предложил это (измените итерационную переменную в понимании, есть другие буквы там, используйте их):

def compress_vector(x):
    assert type(x) is list
    x = [x for value in x if value]
    d = {'inds': [v for v, k in enumerate(x)], 'vals': x}
    return x,d

затем:

x,d = compress_vector(x)

Чтобы изменить [116 ] использование на месте назначение среза , которое не создает новую ссылку, но использует исходную ссылку:

def compress_vector(x):
    assert type(x) is list
    x[:] = [x for value in x if value]
    return {'inds': [v for v, k in enumerate(x)], 'vals': x}
7
задан Peter Mortensen 30 April 2011 в 21:34
поделиться

2 ответа

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

Вот обзор ручных включенных шагов.

  1. Создайте блок с DefineDynamicAssembly
  2. Создайте модуль с DefineDynamicModule
  3. Создайте тип с DefineType. Обязательно передайте TypeAttributes.Interface сделать Ваш тип интерфейсом.
  4. Выполните итерации по участникам в исходном интерфейсе и создайте похожие методы в новом интерфейсе, применив атрибуты по мере необходимости.
  5. Звонить TypeBuilder.CreateType закончить создавать Ваш интерфейс.
8
ответ дан 6 December 2019 в 09:23
поделиться

Для динамического создания сборки с интерфейсом, имеющим атрибуты:

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.

12
ответ дан 6 December 2019 в 09:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: