首页 > 解决方案 > 为什么我生成的带有接口的程序集实现为方法而不是属性?

问题描述

以下代码创建了一个名为 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 中反编译程序集时,我看到了我希望看到的代码:

在此处输入图像描述

然而,在另一个引用这个程序集的项目中,我创建了一个实现我的新 IMyType 的类,Visual Studio 创建了这个: 在此处输入图像描述

我需要做什么才能让 Visual Studio 将其视为自动属性而不是两种方法?

标签: c#typebuilder

解决方案


或许,您应该将您的set方法定义为 void 并采用一个 int 类型的参数。

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

推荐阅读