示例#1
0
            public Type build()
            {
                buildManagedDelegates(tInterface, prefabs.OfType <CustomMarshallerMethod>());

                // Create the proxy type
                TypeBuilder tb = createType(tInterface);

                List <Type> ctorArgsList = new List <Type>();

                ctorArgsList.AddRange(constructorArguments);

                // Create readonly fields
                FieldBuilder[] fields = new FieldBuilder[prefabs.Length];
                for (int i = 0; i < prefabs.Length; i++)
                {
                    var pf = prefabs[i];
                    fields[i] = pf.emitField(tb);
                    Type t = pf.tCtorArg;
                    if (null != t)
                    {
                        ctorArgsList.Add(t);
                    }
                }

                // Create the constructor
                constructorArgumentTypes = ctorArgsList.ToArray();
                addConstructor(tb, constructorArgumentTypes, fields, prefabs);

                BaseInterfaces    baseInterfaces = BaseInterfaces.createIfNeeded(tb, tInterface);
                PropertiesBuilder properties     = PropertiesBuilder.createIfNeeded(tInterface);

                // Create methods
                var conventions = tInterface.GetCustomAttribute <CustomConventionsAttribute>();

                for (int i = 0; i < methods.Length; i++)
                {
                    MethodBuilder mb = declareMethod(tb, methods[i]);
                    prefabs[i].emitMethod(mb, fields[i], conventions);
                    tb.DefineMethodOverride(mb, methods[i]);
                    baseInterfaces?.implementedMethod(mb, methods[i].Name);
                    properties?.implement(tb, methods[i], mb);
                }

                // Finalize the proxy type
                return(tb.CreateType());
            }