发出显式方法重写将隐藏属性

本文关键字:隐藏 属性 重写 方法 | 更新日期: 2024-10-25 00:26:18

有一个类有一个属性:

public class BaseClass
{
  public virtual string Property1 { get; set; }
}

现在,我创建一个带有一些方法重写的派生类型:

[Test]
public void name ()
{
  var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly (new AssemblyName ("Test"), AssemblyBuilderAccess.RunAndSave);
  var moduleBuilder = assemblyBuilder.DefineDynamicModule ("Test.dll");
  var derivedBuilder = moduleBuilder.DefineType ("DerivedClass", TypeAttributes.Public, typeof (BaseClass));
  const MethodAttributes methodAttributes = MethodAttributes.Private | MethodAttributes.Virtual | MethodAttributes.SpecialName | MethodAttributes.NewSlot;
  var getterOverride = derivedBuilder.DefineMethod (
      "get_Property1",
      methodAttributes,
      typeof (string),
      Type.EmptyTypes);
  var getterILGenerator = getterOverride.GetILGenerator();
  getterILGenerator.Emit (OpCodes.Ldnull);
  getterILGenerator.Emit (OpCodes.Ret);
  derivedBuilder.DefineMethodOverride (getterOverride, typeof (BaseClass).GetMethod ("get_Property1"));
  var setterOverride = derivedBuilder.DefineMethod (
      "set_Property1",
      methodAttributes,
      typeof (void),
      new[] { typeof (string) });
  var setterILGenerator = setterOverride.GetILGenerator ();
  setterILGenerator.Emit (OpCodes.Ret);
  derivedBuilder.DefineMethodOverride (setterOverride, typeof (BaseClass).GetMethod ("set_Property1"));
  var derivedType = derivedBuilder.CreateType();
  var props = derivedType.GetProperties (BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
  assemblyBuilder.Save ("Test.dll");
  Assert.That (props, Has.Length.EqualTo (1));
}

生成的类型不再包含该属性。奇怪的是,如果将至少一个方法定义的methodAttributes更改为MethodAttributes.Public,则该属性将再次出现。

好像是一个错误?

编辑:peverify 不会给出错误。

编辑:(Fabian Schmied的重要评论)

ECMA-335 分区 II,10.3.3:"如果类型通过 MethodImpl 重写继承的方法,则可以扩大或缩小该方法的可访问性。

发出显式方法重写将隐藏属性

由于规范(ECMA-335,II.10.3.3)明确允许人们缩小通过MethodImpl覆盖的方法的可见性("显式覆盖",由Reflection.Emit通过TypeBuilder.DefineMethodOverride表示),我相信这确实是Reflection实现中的一个错误,应该通过Microsoft Connect报告。