使用以下C#代码:
public interface IFoo
{
int Bar
{
get;
set;
}
}
属性setter签名编译为:
.method public hidebysig specialname newslot abstract virtual
instance void set_X (
int32 'value'
) cil managed
{
}
用ILSpy或ildasm检查时。
如果我尝试使用System.Reflection.Emit
API生成相同的方法签名,则生成的输入参数名称为空:
.method public hidebysig specialname newslot abstract virtual
instance void set_X (
int32 ''
) cil managed
{
}
(ilspy
生成的签名)
...或看似生成的引用名称(在这种情况下为A_1
):
.method public hidebysig newslot specialname abstract virtual
instance void set_X(
int32 A_1
) cil managed
{
}
(ildasm
生成的签名)
如何在C#编译示例中为输入参数命名为“value”?
这是我用来生成setter的代码:
PropertyBuilder property = typeDef.DefineProperty("X", PropertyAttributes.HasDefault, CallingConventions.HasThis, typeof(int), null);
MethodAttributes ma = MethodAttributes.Public
| MethodAttributes.HideBySig
| MethodAttributes.NewSlot
| MethodAttributes.SpecialName
| MethodAttributes.Abstract
| MethodAttributes.Virtual;
MethodBuilder setMethod = typeDef.DefineMethod("set_X", ma, CallingConventions.HasThis, null, new[] { typeof(int) });
property.SetSetMethod(setMethod);
即使我明确尝试定义参数名称,结果仍然相同:
MethodBuilder setMethod = typeDef.DefineMethod("set_X", ma, CallingConventions.HasThis, null, new[] { typeof(int) });
ParameterBuilder pb = setMethod.DefineParameter(0, ParameterAttributes.None, "value");
property.SetSetMethod(setMethod);
答案 0 :(得分:3)
我认为你必须使用索引1
作为第一个参数。来自MethodBuilder.DefineParameter Method的msdn条目:
<强>说明强>
[...]
参数编号从1开始,因此第一个参数的位置为1。如果 position 为零,则此方法会影响返回值。