Re[4]: Множественное наследование
От: foreign Россия http://www.climber.foreign.cd
Дата: 31.08.04 10:51
Оценка:
Здравствуйте, Dax, Вы писали:

Dax>Это метод реально работающего генератора, может, для ясности кому-нить понадобится

Dax>
Dax>        private void ImplementTrait(TypeBuilder tb, ILGenerator cb, Type trait) {
Dax>            ILGenerator il = null;

Dax>            FieldBuilder fb = tb.DefineField(trait.Name.ToLower(), trait, FieldAttributes.Private | FieldAttributes.InitOnly);

Dax>            ConstructorInfo ci = trait.GetConstructors()[0];

Dax>            cb.Emit(OpCodes.Ldarg_0); // add code for initializer - this.currentTrait = new CurrentTrait(this);
Dax>            cb.Emit(OpCodes.Ldarg_0);
Dax>            cb.Emit(OpCodes.Newobj, ci);
Dax>            cb.Emit(OpCodes.Stfld, fb);

Dax>            foreach(Type iface in trait.GetInterfaces()) { // imp all trait interfaces
Dax>                tb.AddInterfaceImplementation(iface);
Dax>                foreach(MethodInfo mi in iface.GetMethods()) {
Dax>                    ParameterInfo[] pis = mi.GetParameters();
Dax>                    Type[] ts = new Type[pis.Length];
Dax>                    for(int i=0; i<pis.Length; i++) {
Dax>                        ts[i] = pis[i].ParameterType;
Dax>                    }
Dax>                    MethodBuilder mb = tb.DefineMethod(iface.FullName + "+.+" + mi.Name, MethodAttributes.Private | MethodAttributes.Virtual | MethodAttributes.Final, mi.ReturnType, ts);
Dax>                    il = mb.GetILGenerator();
Dax>                    il.Emit(OpCodes.Ldarg_0);
Dax>                    il.Emit(OpCodes.Ldfld, fb);
Dax>                    for(int i=1; i<= pis.Length; i++) {
Dax>                        this.EmitLdarg(il, i);
Dax>                    }
Dax>                    il.Emit(OpCodes.Callvirt, mi);
Dax>                    il.Emit(OpCodes.Ret);
Dax>                    tb.DefineMethodOverride(mb,mi);
Dax>                }
Dax>            }

Dax>        }

Dax>


Dax, если не секрет, откуда код?
... << RSDN@Home 1.1.4 beta 2 >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.