コード例 #1
0
		private static object[] GetConstructorAndArgs(Type attributeType, Attribute attribute, out IConstructorInfo ctor)
		{
			ctor = attributeType.GetConstructors()[0].AsIConstructorInfo();

			var constructorParams = ctor.GetParameters();
			if (constructorParams.Length == 0)
			{
				return new object[0];
			}

			return InitializeConstructorArgs(attributeType, attribute, constructorParams);
		}
コード例 #2
0
        private static object[] GetConstructorAndArgs(Type attributeType, Attribute attribute, out IConstructorInfo ctor)
        {
            ctor = attributeType.GetConstructors()[0].AsIConstructorInfo();

            var constructorParams = ctor.GetParameters();

            if (constructorParams.Length == 0)
            {
                return(new object[0]);
            }

            return(InitializeConstructorArgs(attributeType, attribute, constructorParams));
        }
コード例 #3
0
        protected void GenerateConstructor(ClassEmitter emitter, IConstructorInfo baseConstructor,
                                           params FieldReference[] fields)
        {
            ArgumentReference[] args;
            ParameterInfo[]     baseConstructorParams = null;

            if (baseConstructor != null)
            {
                baseConstructorParams = baseConstructor.GetParameters();
            }

            if (baseConstructorParams != null && baseConstructorParams.Length != 0)
            {
                args = new ArgumentReference[fields.Length + baseConstructorParams.Length];

                var offset = fields.Length;
                for (var i = offset; i < offset + baseConstructorParams.Length; i++)
                {
                    var paramInfo = baseConstructorParams[i - offset];
                    args[i] = new ArgumentReference(paramInfo.ParameterType);
                }
            }
            else
            {
                args = new ArgumentReference[fields.Length];
            }

            for (var i = 0; i < fields.Length; i++)
            {
                args[i] = new ArgumentReference(fields[i].Reference.FieldType);
            }

            var constructor = emitter.CreateConstructor(args);

            if (baseConstructorParams != null && baseConstructorParams.Length != 0)
            {
                var last = baseConstructorParams.Last();

                if (last.ParameterType.IsArray && last.HasAttribute(typeof(ParamArrayAttribute)))
                {
                    var parameter = constructor.ConstructorBuilder.DefineParameter(args.Length, ParameterAttributes.None, last.Name);
                    var builder   = AttributeUtil.CreateBuilder <ParamArrayAttribute>();
                    parameter.SetCustomAttribute(builder);
                }
            }

            for (var i = 0; i < fields.Length; i++)
            {
                constructor.CodeBuilder.AddStatement(new AssignStatement(fields[i], args[i].ToExpression()));
            }

            // Invoke base constructor

            if (baseConstructor != null)
            {
                Debug.Assert(baseConstructorParams != null);

                var slice = new ArgumentReference[baseConstructorParams.Length];
                Array.Copy(args, fields.Length, slice, 0, baseConstructorParams.Length);

                constructor.CodeBuilder.InvokeBaseConstructor(baseConstructor, slice);
            }
            else
            {
                constructor.CodeBuilder.InvokeBaseConstructor();
            }

            constructor.CodeBuilder.AddStatement(new ReturnStatement());
        }
コード例 #4
0
 public Constructor(IConstructorInfo constructorInfo)
 {
     _constructorInfo = constructorInfo;
     _parameters      = constructorInfo.GetParameters();
 }