Цели
Итак, я хочу создать тип во время выполнения с классом TypeBuilder
. Интерфейс, из которого я хочу реализовать тип среды выполнения, выглядит следующим образом.
public interface ITest
{
int TestProperty { get; }
}
Тип, который должен быть сгенерирован, должен выглядеть следующим образом:
internal class Test : ITest
{
int ITest.TestProperty { get => 0; }
}
Явная реализация интерфейса не является действительно необходимым, но это то, на чем я нашел больше всего ресурсов.
Теперь к фактическому коду
var assemblyName = new AssemblyName("AssemblyTest");
var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
var module = assemblyBuilder.DefineDynamicModule(assemblyName.Name + ".dll");
var typeBuilder = module.DefineType("TestType", TypeAttributes.NotPublic | TypeAttributes.BeforeFieldInit | TypeAttributes.AutoClass | TypeAttributes.AnsiClass | TypeAttributes.Class, null, new[] { typeof(ITest) });
var prop = typeBuilder.DefineProperty("ITest.TestProperty", PropertyAttributes.HasDefault, typeof(int), null);
var propGet = typeBuilder.DefineMethod("ITest.get_TestProperty", MethodAttributes.Private | MethodAttributes.SpecialName | MethodAttributes.NewSlot | MethodAttributes.HideBySig | MethodAttributes.Virtual | MethodAttributes.Final);
var propertyGetIL = propGet.GetILGenerator();
propertyGetIL.Emit(OpCodes.Ldc_I4_0);
propertyGetIL.Emit(OpCodes.Ret);
prop.SetGetMethod(propGet);
typeBuilder.DefineMethodOverride(propGet, typeof(ITest).GetProperty("TestProperty").GetGetMethod());
var type = typeBuilder.CreateType();
Просто в качестве краткого объяснения code.
- Создание DynamicAssembly / Module / Class
- Создание поля поддержки и самого свойства
- Создание содержимого метода Get для свойства
- Отметьте свойство как реализацию интерфейса
- Создайте новый тип
Однако метод CreateType
выдает мне следующее :
Подпись тела и объявления в реализации метода не совпадают. Тип: TestType. Сборка: 'AssemblyTest, Версия = 0.0.0.0, Культура = нейтральный, PublicKeyToken = null'. '
Я действительно не уверен, как я буду реализовывать свойство и какова причина этого.