コード例 #1
0
        private IEnumerable <CSharpMember> GetFactoryMethods()
        {
            MethodInfo[] methods = this.RuntimeFactory.GetMethods(BindingFlags.Public | BindingFlags.Instance).Where(method => (method.DeclaringType == this.RuntimeFactory || this.RuntimeFactory.GetInterfaces().Any(i => method.DeclaringType == i)) && !method.IsSpecialName).ToArray();
            foreach (MethodInfo method in methods)
            {
                String            methodType;
                String[]          methodCode;
                CSharpParameter[] methodParams = method.GetParameters().Select(param => new CSharpParameter()
                {
                    ParameterName      = param.Name,
                    ParameterType      = GeneratedRuntimeType.MapTypeName(this, param.ParameterType),
                    ParameterReference = param.IsOut ? CSharpReference.Out : param.IsRetval ? CSharpReference.Ref : Attribute.IsDefined(param, typeof(ParamArrayAttribute)) ? CSharpReference.Params : CSharpReference.None,
                    XmlSummary         = this.GenerateDocumentation(this.RuntimeDocument, param, "summary")
                }).ToArray();
                IHaveEntity iHaveEntity = this.WrappedType as IHaveEntity;

                // Generate the site-less factory method
                Type returnType = method.ReturnType == typeof(void) ? null : GeneratedRuntimeType.MapType(this.RuntimeModel, method.ReturnType);
                if (returnType == null)
                {
                    methodType = null;
                    methodCode = new String[]
                    {
                        "ConsensusSite site = ConsensusDomain.Configuration[ConsensusDomain.Configuration.DefaultSite];",
                        this.WrappedType.DeclarationName + "." + method.Name +
                        (method.GetGenericArguments().Length == 0 ? "" : "<" + String.Join(", ", method.GetGenericArguments().Select(gen => GeneratedRuntimeType.GetTypeName(gen, false))) + ">") +
                        "(" + String.Join(",", new String[] { "site" }.Concat(method.GetParameters().Select(param => param.Name))) + ");"
                    };
                }
                else if (returnType.GetInterfaces().Any(iface => String.Equals(iface.Name, "IModel", StringComparison.Ordinal)))
                {
                    String returnTypeName = GeneratedRuntimeType.GetTypeName(returnType, false);
                    String usableTypeName = GeneratedRuntimeType.GetTypeName(returnType, true);
                    methodType = usableTypeName;
                    methodCode = new String[]
                    {
                        "ConsensusSite site = ConsensusDomain.Configuration[ConsensusDomain.Configuration.DefaultSite];",
                        "return " + this.WrappedType.DeclarationName + "." + method.Name +
                        (method.GetGenericArguments().Length == 0 ? "" : "<" + String.Join(", ", method.GetGenericArguments().Select(gen => GeneratedRuntimeType.GetTypeName(gen, false))) + ">") +
                        "(" + String.Join(",", new String[] { "site" }.Concat(method.GetParameters().Select(param => param.Name))) + ");"
                    };
                }
                else if (returnType.IsGenericType && String.Equals(returnType.FullName.Split('`')[0], "System.Collections.Generic.IEnumerable", StringComparison.Ordinal) && returnType.GetGenericArguments()[0].GetInterfaces().Any(iface => String.Equals(iface.Name, "IModel", StringComparison.Ordinal)))
                {
                    String returnTypeName = GeneratedRuntimeType.GetTypeName(GeneratedRuntimeType.MapType(this.RuntimeModel, returnType.GetGenericArguments().First()), false);
                    String usableTypeName = GeneratedRuntimeType.GetTypeName(GeneratedRuntimeType.MapType(this.RuntimeModel, returnType.GetGenericArguments().First()), true);
                    methodType = "IEnumerable<" + usableTypeName + ">";
                    methodCode = new String[]
                    {
                        "ConsensusSite site = ConsensusDomain.Configuration[ConsensusDomain.Configuration.DefaultSite];",
                        "return " + this.WrappedType.DeclarationName + "." + method.Name +
                        (method.GetGenericArguments().Length == 0 ? "" : "<" + String.Join(", ", method.GetGenericArguments().Select(gen => GeneratedRuntimeType.GetTypeName(gen, false))) + ">") +
                        "(" + String.Join(",", new String[] { "site" }.Concat(method.GetParameters().Select(param => param.Name))) + ");"
                    };
                }
                else
                {
                    methodType = GeneratedRuntimeType.GetTypeName(returnType, false);
                    methodCode = new String[]
                    {
                        "ConsensusSite site = ConsensusDomain.Configuration[ConsensusDomain.Configuration.DefaultSite];",
                        "return " + this.WrappedType.DeclarationName + "." + method.Name +
                        (method.GetGenericArguments().Length == 0 ? "" : "<" + String.Join(", ", method.GetGenericArguments().Select(gen => GeneratedRuntimeType.GetTypeName(gen, false))) + ">") +
                        "(" + String.Join(",", new String[] { "site" }.Concat(method.GetParameters().Select(param => param.Name))) + ");"
                    };
                }
                yield return(GetFactoryMethod(method, methodType, methodParams, methodCode));

                // Generate the sited factory method
                methodParams = new CSharpParameter[] { new CSharpParameter()
                                                       {
                                                           ParameterName = "site", ParameterType = "ConsensusSite"
                                                       } }.Concat(methodParams).ToArray();
                if (returnType == null)
                {
                    methodType = null;
                    methodCode = new String[]
                    {
                        "IBusinessProvider provider = site.GetService<IBusinessProvider>();",
                        "provider." + iHaveEntity.Entity.Container.ContainerName + "." + iHaveEntity.Entity.EntityName + "." + method.Name + (method.GetGenericArguments().Length == 0 ? "" : "<" + String.Join(", ", method.GetGenericArguments().Select(gen => GeneratedRuntimeType.GetTypeName(gen, false))) + ">") + "(" + String.Join(",", method.GetParameters().Select(param => param.Name)) + ");"
                    };
                }
                else if (returnType.GetInterfaces().Any(iface => String.Equals(iface.Name, "IModel", StringComparison.Ordinal)))
                {
                    String returnTypeName = GeneratedRuntimeType.GetTypeName(returnType, false);
                    String usableTypeName = GeneratedRuntimeType.GetTypeName(returnType, true);
                    methodType = usableTypeName;
                    methodCode = new String[]
                    {
                        "IBusinessProvider provider = site.GetService<IBusinessProvider>();",
                        returnTypeName + " model = provider." + iHaveEntity.Entity.Container.ContainerName + "." + iHaveEntity.Entity.EntityName + "." + method.Name + (method.GetGenericArguments().Length == 0 ? "" : "<" + String.Join(", ", method.GetGenericArguments().Select(gen => GeneratedRuntimeType.GetTypeName(gen, false))) + ">") + "(" + String.Join(",", method.GetParameters().Select(param => param.Name)) + ");",
                        "return model == null ? null : new " + methodType + "(model);"
                    };
                }
                else if (returnType.IsGenericType && String.Equals(returnType.FullName.Split('`')[0], "System.Collections.Generic.IEnumerable", StringComparison.Ordinal) && returnType.GetGenericArguments()[0].GetInterfaces().Any(iface => String.Equals(iface.Name, "IModel", StringComparison.Ordinal)))
                {
                    String returnTypeName = GeneratedRuntimeType.GetTypeName(GeneratedRuntimeType.MapType(this.RuntimeModel, returnType.GetGenericArguments().First()), false);
                    String usableTypeName = GeneratedRuntimeType.GetTypeName(GeneratedRuntimeType.MapType(this.RuntimeModel, returnType.GetGenericArguments().First()), true);
                    methodType = "IEnumerable<" + usableTypeName + ">";
                    methodCode = new String[]
                    {
                        "IBusinessProvider provider = site.GetService<IBusinessProvider>();",
                        "IEnumerable<" + returnTypeName + "> collection = provider." + iHaveEntity.Entity.Container.ContainerName + "." + iHaveEntity.Entity.EntityName + "." + method.Name + (method.GetGenericArguments().Length == 0 ? "" : "<" + String.Join(", ", method.GetGenericArguments().Select(gen => GeneratedRuntimeType.GetTypeName(gen, false))) + ">") + "(" + String.Join(",", method.GetParameters().Select(param => param.Name)) + ");",
                        "return collection.Select(model => new " + usableTypeName + "(model));"
                    };
                }
                else
                {
                    methodType = GeneratedRuntimeType.GetTypeName(returnType, false);
                    methodCode = new String[]
                    {
                        "IBusinessProvider provider = site.GetService<IBusinessProvider>();",
                        "return provider." + iHaveEntity.Entity.Container.ContainerName + "." + iHaveEntity.Entity.EntityName + "." + method.Name + (method.GetGenericArguments().Length == 0 ? "" : "<" + String.Join(", ", method.GetGenericArguments().Select(gen => GeneratedRuntimeType.GetTypeName(gen, false))) + ">") + "(" + String.Join(",", method.GetParameters().Select(param => param.Name)) + ");"
                    };
                }
                yield return(GetFactoryMethod(method, methodType, methodParams, methodCode));
            }
        }
コード例 #2
0
        private IEnumerable <CSharpMember> GetModelMethods()
        {
            MethodInfo[] methods = this.RuntimeModel.GetMethods(BindingFlags.Public | BindingFlags.Instance).Where(method => (method.DeclaringType == this.RuntimeModel || this.RuntimeModel.GetInterfaces().Any(i => method.DeclaringType == i)) && !method.IsSpecialName).ToArray();
            foreach (MethodInfo method in methods)
            {
                Boolean isHasPermissionMethod = method.Name == "HasPermission";

                String   methodType = null;
                String[] methodCode = null;
                Type     returnType = method.ReturnType == typeof(void) ? null : GeneratedRuntimeType.MapType(this.RuntimeModel, method.ReturnType);
                if (returnType == null)
                {
                    methodCode = new String[]
                    {
                        "this.Model." + method.Name +
                        (method.GetGenericArguments().Length == 0 ? "" : "<" + String.Join(", ", method.GetGenericArguments().Select(gen => GeneratedRuntimeType.GetTypeName(gen, false))) + ">") +
                        "(" + String.Join(",", method.GetParameters().Select(param => param.Name)) + ");"
                    };
                }
                else if (returnType.GetInterfaces().Any(iface => String.Equals(iface.Name, "IModel", StringComparison.Ordinal)))
                {
                    String returnTypeName = GeneratedRuntimeType.GetTypeName(returnType, false);
                    String usableTypeName = GeneratedRuntimeType.GetTypeName(returnType, true);
                    methodType = usableTypeName;
                    methodCode = new String[]
                    {
                        returnTypeName + " model = this.Model." + method.Name +
                        (method.GetGenericArguments().Length == 0 ? "" : "<" + String.Join(", ", method.GetGenericArguments().Select(gen => GeneratedRuntimeType.GetTypeName(gen, false))) + ">") +
                        "(" + String.Join(",", method.GetParameters().Select(param => param.Name)) + ")" + ");",
                        "return model == null ? null : new " + methodType + "(model);"
                    };
                }
                else if (returnType.IsGenericType && String.Equals(returnType.FullName.Split('`')[0], "System.Collections.Generic.IEnumerable", StringComparison.Ordinal) && returnType.GetGenericArguments()[0].GetInterfaces().Any(iface => String.Equals(iface.Name, "IModel", StringComparison.Ordinal)))
                {
                    String returnTypeName = GeneratedRuntimeType.GetTypeName(returnType, false);
                    String usableTypeName = GeneratedRuntimeType.GetTypeName(returnType, true);
                    returnTypeName = GeneratedRuntimeType.GetTypeName(GeneratedRuntimeType.MapType(this.RuntimeModel, returnType.GetGenericArguments().First()), false);
                    methodType     = "IEnumerable<" + usableTypeName + ">";
                    methodCode     = new String[]
                    {
                        "return this.Model." + method.Name +
                        (method.GetGenericArguments().Length == 0 ? "" : "<" + String.Join(", ", method.GetGenericArguments().Select(gen => GeneratedRuntimeType.GetTypeName(gen, false))) + ">") +
                        "(" + String.Join(",", method.GetParameters().Select(param => param.Name)) + ")" +
                        ".Select(model => new " + methodType + "(model));"
                    };
                }
                else
                {
                    methodType = GeneratedRuntimeType.GetTypeName(returnType, false);
                    methodCode = new String[]
                    {
                        "return this.Model." + method.Name +
                        (method.GetGenericArguments().Length == 0 ? "" : "<" + String.Join(", ", method.GetGenericArguments().Select(gen => GeneratedRuntimeType.GetTypeName(gen, false))) + ">") +
                        "(" + String.Join(",", method.GetParameters().Select(param => param.Name)) + ");"
                    };
                }

                yield return(new CSharpMethod(this)
                {
                    Name = method.Name,
                    Attributes = method.GetCustomAttributes().Select(attr => attr.GetType().Name).ToArray(),
                    MethodType = methodType,
                    MethodGenerics = method.GetGenericArguments().Select(generic => new CSharpGeneric()
                    {
                        GenericName = generic.Name,
                        XmlSummary = this.GenerateDocumentation(this.RuntimeDocument, generic, "summary"),
                        GenericConstraints = generic.GetGenericParameterConstraints().Select(con => con.Name).ToArray()
                    }).ToArray(),
                    MethodParameters = method.GetParameters().Select(param => new CSharpParameter()
                    {
                        ParameterName = param.Name,
                        ParameterType = GeneratedRuntimeType.MapTypeName(this, param.ParameterType),
                        ParameterReference = param.IsOut ? CSharpReference.Out : param.IsRetval ? CSharpReference.Ref : Attribute.IsDefined(param, typeof(ParamArrayAttribute)) ? CSharpReference.Params : CSharpReference.None,
                        XmlSummary = this.GenerateDocumentation(this.RuntimeDocument, param, "summary")
                    }).ToArray(),
                    MethodCode = methodCode
                });
            }
        }
コード例 #3
0
 /// <summary>
 ///     Maps a concrete type to its interface.
 /// </summary>
 /// <param name="type">
 ///     The runtime type to be mapped
 /// </param>
 /// <returns>
 ///     The interface to which the type is mapped.
 /// </returns>
 public static String MapTypeName(GeneratedEncapsulatorClass injector, Type type)
 {
     return(GeneratedRuntimeType.MapTypeName(injector.RuntimeModel, type));
 }
コード例 #4
0
        /// <summary>
        ///     Gets the declaration name for a runtime type.
        /// </summary>
        private static String GetTypeName(Type injectedType, Type type)
        {
            // Get the true name of the type
            String typeName = type.Name;

            if (type.GetGenericArguments().Length != 0)
            {
                typeName = typeName.Split('`').First() + "<" + String.Join(", ", type.GetGenericArguments().Select(gen => GeneratedRuntimeType.MapTypeName(injectedType, gen))) + ">";
            }

            // Prefix the type with its namespace and suffix array types with square brackets
            if (type.IsGenericParameter)
            {
                typeName = type.Name;
            }
            else
            {
                typeName = type.Namespace + "." + typeName;
            }

            if (type.IsArray && !typeName.EndsWith("[]"))
            {
                typeName += "[]";
            }

            return(typeName);
        }
コード例 #5
0
 /// <summary>
 ///     Maps a concrete type to its interface.
 /// </summary>
 /// <param name="type">
 ///     The runtime type to be mapped
 /// </param>
 /// <returns>
 ///     The interface to which the type is mapped.
 /// </returns>
 public static String MapTypeName(GeneratedInjectorClass injector, Type type)
 {
     return(GeneratedRuntimeType.MapTypeName(injector.RuntimeType, type));
 }