Применить функцию к столбцу списков данных

Редактирование: Вот мой окончательный рабочий ответ:

        AssemblyName asn = new AssemblyName("test.dll");
        AssemblyBuilder asb = AppDomain.CurrentDomain.DefineDynamicAssembly(
            asn, AssemblyBuilderAccess.RunAndSave, @"D:\test_assemblies");

        ModuleBuilder modb = asb.DefineDynamicModule("test", "test.dll");

        TypeBuilder tb = modb.DefineType(
            "test",
            TypeAttributes.Public | TypeAttributes.Class);
        // Typebuilder is a sub class of Type
        tb.SetParent(typeof(OtherClass<>).MakeGenericType(tb));
        var t2 = tb.CreateType();
        var i = Activator.CreateInstance(t2);

Хитрость заключается в вызове SetParent с параметризованным общим типом, параметр - тип строителя самого типа, который был сконструирован сам.


Используйте метод TypeBuilder.SetParent (Тип родителя) .

Будьте осторожны при использовании этого метода, исключение бросается на вызов CreateType:

Если parent имеет значение null, Object используется как базовый тип.

В версиях .NET Framework версии 1.0 и 1.1 исключение не генерируется, если родительский тип интерфейса, но TypeLoadException вызывается при вызове метода CreateType.

Метод SetParent не проверяет большинство недопустимых родительских типов. Например, он не отклоняет родительский тип, который не имеет конструктора по умолчанию, когда текущий тип имеет конструктор по умолчанию, он не отвергает закрытые типы и не отклоняет тип делегирования. Во всех этих случаях исключения генерируются методом CreateType.

blockquote>

Чтобы создать свой общий тип OtherClass, используйте метод MakeGenericType :

var genericType = typeof(OtherClass<>).MakeGenericType(typeof(MyClass));

0
задан marc_s 17 March 2019 в 11:03
поделиться