System.Reflection.Emit.DynamicILGenerator.DeclareLocal C# (CSharp) Method

DeclareLocal() public method

public DeclareLocal ( Type localType, bool pinned ) : LocalBuilder
localType System.Type
pinned bool
return LocalBuilder
        public override LocalBuilder DeclareLocal(Type localType, bool pinned) {
            LocalBuilder localBuilder;
            if (localType == null) 
                throw new ArgumentNullException("localType");
            if (localType.GetType() != typeof(RuntimeType)) 
                throw new ArgumentException(Environment.GetResourceString("Argument_MustBeRuntimeType"));
            localBuilder = new LocalBuilder(m_localCount, localType, m_methodBuilder);
            // add the localType to local signature
            m_localSignature.AddArgument(localType, pinned);
            m_localCount++;
            return localBuilder;
        }

Usage Example

		private void GenerateMethod(TypeBuilder type, MethodMetadata methodMetadata)
		{
			if(type == null)
				throw new ArgumentNullException("type");

			if(methodMetadata == null)
				throw new ArgumentNullException("methodMetadata");

			var attrs = MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.HideBySig;
			var callingConvenction = CallingConventions.HasThis;
			var parameters = methodMetadata.Parameters.Select(x => x.Type).ToArray();

			var method = type.DefineMethod(methodMetadata.Name, attrs, callingConvenction, methodMetadata.ReturnType, parameters);

			var il = method.GetILGenerator();
			var g = new DynamicILGenerator(il);

			foreach(var parameter in methodMetadata.Parameters)
				method.DefineParameter(parameter.Position, ParameterAttributes.None, parameter.Name);

			foreach(var local in methodMetadata.Block.Locals)
				g.DeclareLocal(local);

			foreach(var line in methodMetadata.Block.Lines)
				this.GenerateLine(g, line);
		}