Exemplo n.º 1
0
        public override ILCoder GetCoder()
        {
            if (this._isBuild)
            {
                throw new CodingException("Metodun tanımlandığı tip derlenmiş. Derlenmiş metotların gövdesi yeniden yazılamaz.");
            }

            if (this._coder == null)
            {
                this.ConstructorBuilder = base.ILTypeBuilder.TypeBuilder.DefineConstructor(this._methodAttributes, this._conventions, this.GetParameterTypes());
                for (int i = 0; i < this._parameters.Count; i++)
                {
                    ILParameterInfo parameter = this._parameters[i];
                    parameter.Builder = this.ConstructorBuilder.DefineParameter(i + 1, parameter.Attributes, parameter.ParameterName);

                    if (parameter.OptionalValue != null)
                    {
                        parameter.Builder.SetConstant(parameter.OptionalValue);
                    }
                }
                return(this._coder = new ILCoder(this, this.ConstructorBuilder.GetILGenerator()));
            }
            else
            {
                return(this._coder);
            }
        }
        public void AddParameter(string genericTypeName, Type[] constraints, string name, ParameterAttributes attributes)
        {
            GenericTypeParameterBuilder parameterBuilder = this.TypeOfGenericArgument(genericTypeName) as GenericTypeParameterBuilder;

            this.AddParameter(parameterBuilder, name, attributes, null);

            if (constraints != null || constraints.Length > 0)
            {
                ILParameterInfo parameterInfo = this.GetParameterInfo(this._nameToIndex[name]);
                parameterInfo.Constraints = constraints.Clone() as Type[];
                if (constraints[0].IsClass)
                {
                    parameterBuilder.SetBaseTypeConstraint(constraints[0]);
                    Type[] interfaceConsts = new Type[constraints.Length - 1];
                    Array.Copy(constraints, 1, interfaceConsts, 0, interfaceConsts.Length);
                    if (interfaceConsts.Length > 0)
                    {
                        parameterBuilder.SetInterfaceConstraints(interfaceConsts);
                    }
                }
                else
                {
                    parameterBuilder.SetInterfaceConstraints(constraints);
                }
            }
        }
        public override ILCoder GetCoder()
        {
            if (this._isBuild)
            {
                throw new CodingException("Metot daha önce derlenmiş. Derlenmiş metotların gövdesi yeniden yazılamaz.");
            }

            if (this._coder == null)
            {
                this._isImplemented = true;
                this._dynMethod     = new DynamicMethod(this.Name, this._attributes, this._conventions, this.ReturnType, this.GetParameterTypes(), this.DeclaringType, false);
                for (int i = 0; i < this._parameters.Count; i++)
                {
                    ILParameterInfo parameter = this._parameters[i];
                    parameter.Builder = this.DynamicMethod.DefineParameter(i + 1, parameter.Attributes, parameter.ParameterName);

                    if (parameter.OptionalValue != null)
                    {
                        parameter.Builder.SetConstant(parameter.OptionalValue);
                    }
                }
                return(this._coder = new ILCoder(this, this.DynamicMethod.GetILGenerator()));
            }
            else
            {
                return(this._coder);
            }
        }
Exemplo n.º 4
0
        public override void AddParameter(Type type, string name, ParameterAttributes attributes, object optionalValue)
        {
            if (this._coder != null)
            {
                throw new DefinitionException("Metot gövdesi yazılmaya başlandıktan sonra parametre eklemesi yapılamaz.");
            }

            ILParameterInfo parameter = new ILParameterInfo {
                Attributes = attributes, ParameterName = name, ParameterType = type, OptionalValue = optionalValue
            };

            this._nameToIndex.Add(name, this._parameterTypes.Count);
            this._parameterTypes.Add(type);
            this._parameters.Add(parameter);
        }
Exemplo n.º 5
0
        internal ILArgument(ILCoder coding, int argNo, Type argumentType)
            : base(coding)
        {
            this._parameterInfo = coding.CurrentMethod.GetParameterInfo(argNo);
            this._isByRef       = argumentType.IsByRef;

            if (coding.CurrentMethod.IsStatic)
            {
                this._argNo = argNo;
            }
            else
            {
                this._argNo = argNo + 1;
            }

            if (this._isByRef)
            {
                this._argType = argumentType.GetElementType();
            }
            else
            {
                this._argType = argumentType;
            }
        }
        public override ILCoder GetCoder()
        {
            if (this._isBuild)
            {
                throw new CodingException("Metodun tanımlandığı tip derlenmiş. Derlenmiş metotların gövdesi yeniden yazılamaz.");
            }
            if (this.IsAbstract)
            {
                throw new CodingException("Soyut metotların gövdesi tanımlanamaz.");
            }

            if (this._coder == null)
            {
                this.MethodBuilder.SetParameters(this._parameterTypes.ToArray());
                this.MethodBuilder.SetReturnType(this.ReturnType);
                for (int i = 0; i < this._parameterTypes.Count; i++)
                {
                    ILParameterInfo param = this._parameters[i];
                    if (this.MethodBuilder.IsStatic)
                    {
                        param.Builder = this.MethodBuilder.DefineParameter(i, param.Attributes, param.ParameterName);
                    }
                    else
                    {
                        param.Builder = this.MethodBuilder.DefineParameter(i + 1, param.Attributes, param.ParameterName);
                    }

                    if (param.OptionalValue != null)
                    {
                        param.Builder.SetConstant(param.OptionalValue);
                    }
                }
                this._coder = new ILCoder(this, this.MethodBuilder.GetILGenerator());
            }
            return(this._coder);
        }
        public void CopyParametersFrom(MethodInfo info)
        {
            if (this._coder != null)
            {
                throw new DefinitionException("Metot gövdesi yazılmaya başlandıktan sonra parametre eklemesi yapılamaz.");
            }

            if (this.IsOverride)
            {
                throw new DefinitionException("Geçersiz kılınmış metotlar üzerine parametre eklemesi yapılamaz.");
            }

            if (info.IsGenericMethod)
            {
                Type[]   genericArgTypes = info.GetGenericArguments();
                string[] genericArgNames = new string[genericArgTypes.Length];
                for (int i = 0; i < genericArgTypes.Length; i++)
                {
                    genericArgNames[i] = genericArgTypes[i].Name;
                }
                this.DefineGenericParameters(genericArgNames);

                ParameterInfo[] methodParameters = info.GetParameters();
                for (int i = 0; i < methodParameters.Length; i++)
                {
                    ParameterInfo parameter     = methodParameters[i];
                    Type          parameterType = parameter.ParameterType;
                    Type[]        constraints   = null;
                    if (parameter.ParameterType.IsGenericParameter)
                    {
                        constraints = parameter.ParameterType.GetGenericParameterConstraints();
                    }

                    string genericTypeName = null;

                    if (parameterType.IsArray)
                    {
                        Type elementType = parameterType.GetElementType();
                        int  rank        = parameterType.GetArrayRank();
                        if (this.ContainsGenericParameterName(elementType.Name))
                        {
                            Type copyParameterType = this.TypeOfGenericArgument(genericTypeName = elementType.Name).MakeArrayType(rank);
                            if (parameterType.IsByRef)
                            {
                                copyParameterType = copyParameterType.MakeByRefType();
                            }
                            this.AddParameter(copyParameterType, parameter.Name, parameter.Attributes);
                        }
                        else
                        {
                            this.AddParameter(parameterType, parameter.Name, parameter.Attributes);
                        }
                    }
                    else
                    {
                        if (this.ContainsGenericParameterName(parameterType.Name))
                        {
                            Type copyParameterType = this.TypeOfGenericArgument(genericTypeName = parameterType.Name);
                            if (parameterType.IsByRef)
                            {
                                copyParameterType = copyParameterType.MakeByRefType();
                            }
                            this.AddParameter(copyParameterType, parameter.Name, parameter.Attributes);
                        }

                        else
                        {
                            Type copyParameterType = parameterType;
                            this.AddParameter(copyParameterType, parameter.Name, parameter.Attributes);
                        }
                    }


                    if ((constraints != null && constraints.Length > 0) && genericTypeName != null)
                    {
                        ILParameterInfo parameterInfo = this.GetParameterInfo(this._nameToIndex[parameter.Name]);
                        parameterInfo.Constraints = constraints.Clone() as Type[];
                        GenericTypeParameterBuilder parameterBuilder = this.TypeOfGenericArgument(genericTypeName) as GenericTypeParameterBuilder;
                        if (constraints[0].IsClass)
                        {
                            parameterBuilder.SetBaseTypeConstraint(constraints[0]);
                            Type[] interfaceConsts = new Type[constraints.Length - 1];
                            Array.Copy(constraints, 1, interfaceConsts, 0, interfaceConsts.Length);
                            if (interfaceConsts.Length > 0)
                            {
                                parameterBuilder.SetInterfaceConstraints(interfaceConsts);
                            }
                        }
                        else
                        {
                            parameterBuilder.SetInterfaceConstraints(constraints);
                        }
                    }
                }

                Type   returnType        = info.ReturnType;
                Type[] returnConstraints = null;
                if (returnType.IsGenericParameter)
                {
                    returnConstraints = returnType.GetGenericParameterConstraints();
                }

                if (returnType.IsArray)
                {
                    Type elementType = returnType.GetElementType();
                    int  rank        = returnType.GetArrayRank();
                    if (this.ContainsGenericParameterName(elementType.Name))
                    {
                        this.SetReturnType(this.TypeOfGenericArgument(elementType.Name).MakeArrayType(rank));
                    }
                    else
                    {
                        this.SetReturnType(returnType);
                    }
                }
                else
                {
                    if (this.ContainsGenericParameterName(returnType.Name))
                    {
                        this.SetReturnType(this.TypeOfGenericArgument(returnType.Name));
                    }
                    else
                    {
                        this.SetReturnType(returnType);
                    }
                }

                if (returnConstraints != null && returnConstraints.Length > 0)
                {
                    GenericTypeParameterBuilder parameterBuilder = this.TypeOfGenericArgument(returnType.Name) as GenericTypeParameterBuilder;
                    if (returnConstraints[0].IsClass)
                    {
                        parameterBuilder.SetBaseTypeConstraint(returnConstraints[0]);
                        Type[] interfaceConsts = new Type[returnConstraints.Length - 1];
                        Array.Copy(returnConstraints, 1, interfaceConsts, 0, interfaceConsts.Length);
                        if (interfaceConsts.Length > 0)
                        {
                            parameterBuilder.SetInterfaceConstraints(interfaceConsts);
                        }
                    }
                    else
                    {
                        parameterBuilder.SetInterfaceConstraints(returnConstraints);
                    }
                }
            }
            else
            {
                ParameterInfo[] methodParameters = info.GetParameters();
                for (int i = 0; i < methodParameters.Length; i++)
                {
                    ParameterInfo parameter = methodParameters[i];
                    this.AddParameter(parameter.ParameterType, parameter.Name, parameter.Attributes);
                }
                Type returnType = info.ReturnType;
                this.SetReturnType(returnType);
            }
        }