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();
 }
Exemple #2
0
        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 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 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);
 }