Здравствуйте, 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 >>