5

1つのプロパティを持つクラスがあります:

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));
}

生成されたタイプには、プロパティが含まれていません。不思議なことに、少なくとも1つのメソッド定義のmethodAttributesをに変更すると、プロパティが再び表示されます。MethodAttributes.Public

バグのようですか?

編集: peverifyはエラーを出しません。

編集: (FabianSchmiedの重要なコメント)

ECMA-335パーティションII、10.3.3:「タイプがMethodImplを介して継承されたメソッドをオーバーライドする場合、そのメソッドのアクセシビリティを拡大または縮小できます。」

4

1 に答える 1

4

仕様(ECMA-335、II.10.3.3)では、MethodImpl(TypeBuilder.DefineMethodOverrideを介したReflection.Emitで表される「明示的なオーバーライド」)を介してオーバーライドされるメソッドの可視性を明示的に狭めることができるため、これは確かにReflection実装のバグであり、MicrosoftConnectを介して報告する必要があります。

于 2012-08-07T13:12:38.017 に答える