c# - 为什么我生成的带有接口的程序集实现为方法而不是属性?
问题描述
以下代码创建了一个名为 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 将其视为自动属性而不是两种方法?
解决方案
或许,您应该将您的set
方法定义为 void 并采用一个 int 类型的参数。
MethodBuilder setBuilder =
typeBuilder.DefineMethod(
"set_MyProperty",
MethodAttributes.Virtual |
MethodAttributes.Abstract |
MethodAttributes.SpecialName,
typeof(void),
new[] { typeof(int) }
);
推荐阅读
- ios - Node.js + APN:在本地,一切正常,但在云主机上启动时出现“端点错误:无法获取本地颁发者证书”
- php - 使用 htaccess 重写和简单的 php switch case 处理查询参数?
- java - 我想让一个数字每 x 毫秒增加一次,但是 Thread.sleep() 一次完成
- flutter - Flutter 小部件未在热重载中显示其显示
- react-native - RN 0.63 如何在我的应用完成播放自己的文件后恢复其他应用在后台播放的音乐
- c - 为什么使用浮点变量的计算与我的想法不同?
- python-3.x - 无法使用 pyinstaller 执行脚本 py 到 exe
- sql - 获取 sql 结果中的预定义记录,而不管它是否存在
- android - 无法解决“原因:android.view.InflateException: Binary XML file line #12: Binary XML file line #11: Error inflating class fragment”
- nginx - kuberntes 入口重写 URL 不会根据正则表达式规则被覆盖