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を介して継承されたメソッドをオーバーライドする場合、そのメソッドのアクセシビリティを拡大または縮小できます。」