Создать свойство MustOverride с отражением? - PullRequest
1 голос
/ 10 апреля 2009

Может кто-нибудь сказать мне, как я бы создал MustOverride свойство с помощью Reflection?

Ответы [ 2 ]

3 голосов
/ 10 апреля 2009

Вы имеете в виду с Reflection.Emit? Если это так, вы используете TypeBuilder.DefineMethod, с MethodAttributes.Abstract.

Вот пример; в Bar.Method есть abstract; Bar2.Method переопределяет.

    AssemblyName an = new AssemblyName("Foo");
    var asm = AppDomain.CurrentDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.Run);
    var module = asm.DefineDynamicModule("Foo");
    var type = module.DefineType("Bar", TypeAttributes.Abstract | TypeAttributes.Class | TypeAttributes.AnsiClass);
    var method = type.DefineMethod("Method", MethodAttributes.Abstract | MethodAttributes.Public | MethodAttributes.Virtual,
        CallingConventions.HasThis, typeof(int), Type.EmptyTypes);

    var final = type.CreateType();

    type = module.DefineType("Bar2", TypeAttributes.Sealed | TypeAttributes.Class | TypeAttributes.AnsiClass, final);
    var method2 = type.DefineMethod("Bar", MethodAttributes.Public | MethodAttributes.Virtual,
        CallingConventions.HasThis, typeof(int), Type.EmptyTypes);
    var il = method2.GetILGenerator();
    il.Emit(OpCodes.Ldc_I4_4);
    il.Emit(OpCodes.Ret);
    type.DefineMethodOverride(method2, method);

    var concrete = type.CreateType();
    object obj = Activator.CreateInstance(concrete);
    int result = (int) concrete.GetMethod("Bar").Invoke(obj, null);
0 голосов
/ 10 апреля 2009

Вы имеете в виду CodeDOM? Отражение используется для чтения существующего кода, а не создания нового кода.

Если вы действительно имеете в виду CodeDOM, я считаю, что вам просто нужно создать CodeMemberProperty и установить для его свойства Attributes значение MemberAttributes.Abstract.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...