Как динамически создать класс C#, который наследует от общего базового класса, ссылающегося на себя (t: base <t>)? [закрC#

Место общения программистов C#
Ответить
Anonymous
 Как динамически создать класс C#, который наследует от общего базового класса, ссылающегося на себя (t: base <t>)? [закр

Сообщение Anonymous »

Я пытаюсь динамически генерировать C# class t во время выполнения, используя Offuret.emit (или другие методы создания динамического типа). Задача состоит в том, что базовый класс представляет собой общий тип U , который является уже статически определенным , и я хочу, чтобы динамически созданный класс наследовал от него, используя себя в качестве аргумента типа. Другими словами, я хочу создать тип, который удовлетворяет: < /p>
class T : U { }

Сложность заключается в том, что T не существует в тот момент, когда мне нужно указать общий аргумент для базового класса. Я пробовал подходы, такие как: < /p>
Type baseType = typeof(U).MakeGenericType(dynamicTypeBuilder); // incorrect

… Но это не компилируется, потому что Dynamictypebuilder еще не является завершенным типом.
Есть ли способ в C# для динамического создания типа t , что он определяет от общего базового класса u , где t определяется? Если да, то как это можно сделать, используя musterce.emit или аналогичные механизмы генерации типа выполнения? Следовательно, избегание CRTP (с любопытством повторяющимся шаблоном) невозможно. Конкретный пример кода не связан с этим вопросом, поэтому он предоставляется по этой ссылке: https://github.com/manju-summoner/yukku ... urcustomak /> пример кода, который вызывает исключение < /h2>

using System;
using System.Reflection;
using System.Reflection.Emit;

class Program
{
static void Main()
{
var asm = AssemblyBuilder.DefineDynamicAssembly(
new AssemblyName("A"), AssemblyBuilderAccess.Run);
var mod = asm.DefineDynamicModule("M");

var tb = mod.DefineType("E", TypeAttributes.Public | TypeAttributes.Class);

var baseType = typeof(B).MakeGenericType(tb);
tb.SetParent(baseType);

var baseMethod = typeof(B).GetMethod("U", BindingFlags.Public | BindingFlags.Instance);
var mb = tb.DefineMethod(
"U",
MethodAttributes.Public | MethodAttributes.Virtual,
typeof(void),
Type.EmptyTypes);

var il = mb.GetILGenerator();
il.Emit(OpCodes.Ret);

tb.DefineMethodOverride(mb, baseMethod);

var t = tb.CreateType();
Console.WriteLine(t.FullName);
}
}

public abstract class B
{
public abstract void U();

public void F()
{
Console.WriteLine("F called");
}
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... -base-clas
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»