Почему моя сгенерированная сборка с интерфейсом реализуется как методы, а не как свойство? - PullRequest
0 голосов
/ 01 мая 2019

Следующий код создает сборку с именем MyAssembly.dll, которая содержит один интерфейс с именем IMyType.IMyType имеет единственное свойство, которое называется my property.

string assemblyName = "MyAssembly";

AssemblyBuilder assemblyBuilder =
    AppDomain.CurrentDomain.DefineDynamicAssembly(
        new AssemblyName(assemblyName),
        AssemblyBuilderAccess.RunAndSave
    );

ModuleBuilder moduleBuilder =
    assemblyBuilder.DefineDynamicModule(
        assemblyName,
        $"{assemblyName}.dll",
        true
    );

TypeBuilder typeBuilder =
    moduleBuilder.DefineType(
        $"{assemblyName}.IMyType",
        TypeAttributes.Public |
        TypeAttributes.Interface |
        TypeAttributes.Abstract
    );

PropertyBuilder propertyBuilder =
    typeBuilder.DefineProperty(
        "MyProperty",
        System.Reflection.PropertyAttributes.HasDefault |
        System.Reflection.PropertyAttributes.SpecialName,
        typeof(int),
        null
    );

MethodBuilder getBuilder =
    typeBuilder.DefineMethod(
        "get_MyProperty",
        MethodAttributes.Virtual |
        MethodAttributes.Abstract |
        MethodAttributes.SpecialName,
        typeof(int),
        Type.EmptyTypes
    );
MethodBuilder setBuilder =
    typeBuilder.DefineMethod(
        "set_MyProperty",
        MethodAttributes.Virtual |
        MethodAttributes.Abstract |
        MethodAttributes.SpecialName,
        typeof(int),
        Type.EmptyTypes
    );

propertyBuilder.SetGetMethod(getBuilder);
propertyBuilder.SetSetMethod(setBuilder);

typeBuilder.CreateType();

assemblyBuilder.Save($"{assemblyName}.dll");

Когда я декомпилирую сборку в DotPeek, я вижу код, который я ожидаю увидеть:

enter image description here

Однако в другом проекте, который ссылается на эту сборку, я создаю класс, который реализует мой новый IMyType, а Visual Studio создает это: enter image description here

Что мне нужно для этого сделатьчто визуальная студия увидит это как свойство auto вместо двух методов?

1 Ответ

1 голос
/ 01 мая 2019

Вероятно, вы должны определить свой метод set как void и принять один аргумент типа int.

MethodBuilder setBuilder =
    typeBuilder.DefineMethod(
        "set_MyProperty",
        MethodAttributes.Virtual |
        MethodAttributes.Abstract |
        MethodAttributes.SpecialName,
        typeof(void),
        new[] { typeof(int) }
    );
...