public SubjectMethodExistsForDuckProxySubjectCoder(IProxyCodeBuilder pcb, Type methodExistsSubjectType, Type realSubjectType) { _methodExistsSubjectType = methodExistsSubjectType; _realSubjectType = realSubjectType; var pcd = MethodIndexFactory.GetProxyClassDescriptorForSubjectType(methodExistsSubjectType); _methodIndexProxyType = pcb.ProxyCoderContext.ProxyModule.GetTypeFromProxyClassDescriptor(pcd); _ftb = pcb.SelfTypeBuilder; _smiMethod = GenerateStaticFromMethodIndex(); }
public void GenerateStaticCtor(IFooTypeBuilder ftb, FieldInfo funcField, MethodInfo getMethod) { var gen = ftb.DefineConstructor(MethodAttributes.Static, CallingConventions.Standard, null).GetILGenerator(); gen.Emit(OpCodes.Ldnull); gen.Emit(OpCodes.Ldftn, getMethod); gen.Emit(OpCodes.Newobj, typeof(Func <object>).GetConstructors().First()); gen.Emit(OpCodes.Stsfld, funcField); gen.Emit(OpCodes.Ret); }
public virtual Type Generate(Action <IFooTypeBuilder> whenTypeDefined) { string typeName = _pm.AssemblyName + ".Proxy_" + Guid.NewGuid().ToString("N"); _tb = _mb.DefineType(typeName, TypeAttributes.Class, _pcd.BaseClassType, _pcd.Mixins.SelectMany(m => m.Subjects).Select(s => s.Type).ToArray()); _ftb = new FooTypeFromTypeBuilder(_tb); whenTypeDefined(_ftb); CreateMixinCoderContexts(); _mixinCoderContexts.ForEach(a => a.Start()); _mixinCoderContexts.ForEach(a => a.SetupCtor()); GenerateConstructors(_pcd.BaseClassType); _mixinCoderContexts.ForEach(a => a.Generate()); _mixinCoderContexts.ForEach(a => a.CreateSubjectCoderContexts()); _mixinCoderContexts.ForEach(a => a.GenerateSubjects()); return(_tb.CreateType()); }
public void GenerateStaticCtor(IFooTypeBuilder ftb, FieldInfo funcField, MethodInfo getMethod) { var gen = ftb.DefineConstructor(MethodAttributes.Static, CallingConventions.Standard, null).GetILGenerator(); gen.Emit(OpCodes.Ldnull); gen.Emit(OpCodes.Ldftn, getMethod); gen.Emit(OpCodes.Newobj, typeof(Func<object>).GetConstructors().First()); gen.Emit(OpCodes.Stsfld, funcField); gen.Emit(OpCodes.Ret); }