Испускать явную реализацию интерфейса свойства - PullRequest
1 голос
/ 09 мая 2020

Цели

Итак, я хочу создать тип во время выполнения с классом 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.

  1. Создание DynamicAssembly / Module / Class
  2. Создание поля поддержки и самого свойства
  3. Создание содержимого метода Get для свойства
  4. Отметьте свойство как реализацию интерфейса
  5. Создайте новый тип

Однако метод CreateType выдает мне следующее :

Подпись тела и объявления в реализации метода не совпадают. Тип: TestType. Сборка: 'AssemblyTest, Версия = 0.0.0.0, Культура = нейтральный, PublicKeyToken = null'. '

Я действительно не уверен, как я буду реализовывать свойство и какова причина этого.

1 Ответ

1 голос
/ 09 мая 2020

Вам не хватает возвращаемого типа при определении метода get. Вам нужно указать его, используя другую перегрузку из DefineMethod:

var propGet = typeBuilder.DefineMethod("ITest.get_TestProperty", 
  MethodAttributes.Private | MethodAttributes.SpecialName | MethodAttributes.NewSlot | 
  MethodAttributes.HideBySig | MethodAttributes.Virtual | MethodAttributes.Final,
  typeof(int), // <--- return type
  Type.EmptyTypes // <-- parameter types (indexers)
);
...