为什么我生成的带有接口的程序集实现为方法而不是 属性?
Why does my generated assembly with interface implement as methods instead of as property?
以下代码创建了一个名为 MyAssembly.dll 的程序集,其中包含一个名为 IMyType 的接口。 IMyType 有一个名为 my 属性.
的 属性
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 中反编译程序集时,我看到了我希望看到的代码:
在另一个引用此程序集的项目中,我创建了一个 class 来实现我的新 IMyType 并且 visual studio 创建了这个:
我需要做什么才能让 visual studio 将其视为自动 属性 而不是两种方法?
或许,您应该将 set
方法定义为 void 并采用一个 int 类型的参数。
MethodBuilder setBuilder =
typeBuilder.DefineMethod(
"set_MyProperty",
MethodAttributes.Virtual |
MethodAttributes.Abstract |
MethodAttributes.SpecialName,
typeof(void),
new[] { typeof(int) }
);
以下代码创建了一个名为 MyAssembly.dll 的程序集,其中包含一个名为 IMyType 的接口。 IMyType 有一个名为 my 属性.
的 属性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 中反编译程序集时,我看到了我希望看到的代码:
在另一个引用此程序集的项目中,我创建了一个 class 来实现我的新 IMyType 并且 visual studio 创建了这个:
我需要做什么才能让 visual studio 将其视为自动 属性 而不是两种方法?
或许,您应该将 set
方法定义为 void 并采用一个 int 类型的参数。
MethodBuilder setBuilder =
typeBuilder.DefineMethod(
"set_MyProperty",
MethodAttributes.Virtual |
MethodAttributes.Abstract |
MethodAttributes.SpecialName,
typeof(void),
new[] { typeof(int) }
);