Я пытаюсь динамически генерировать 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
Как динамически создать класс C#, который наследует от общего базового класса, ссылающегося на себя (t: base <t>)? [закр ⇐ C#
Место общения программистов C#
1757942192
Anonymous
Я пытаюсь динамически генерировать C# class t во время выполнения, используя Offuret.emit (или другие методы создания динамического типа). Задача состоит в том, что базовый класс представляет собой общий тип U , который является [b] уже статически определенным [/b], и я хочу, чтобы динамически созданный класс наследовал от него, используя себя в качестве аргумента типа. Другими словами, я хочу создать тип, который удовлетворяет: < /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/yukkurimoviemaker.plugin.community/blob/master/yukkurimoviemaker.plugin.community/effect/video/lensblurcustmefcefce.cmunity/effect/video/lensblurcuretmaker.cmunity/effect/video/lensblurcustmaker.cmunity/effect/video/lensblurcustomak /> пример кода, который вызывает исключение < /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");
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79765064/how-to-dynamically-create-a-c-sharp-class-that-inherits-from-a-generic-base-clas[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия