예제 #1
0
파일: HandlerHelper.cs 프로젝트: ktj007/mmo
        private static bool CheckIfParametersEquals(ParameterInfo[] parameters, params Type[] targets)
        {
            if (parameters.Length != targets.Length)
                return false;

            return !parameters.Where((each, index) => each.ParameterType != targets[index]).Any();
        }
예제 #2
0
        private static bool IsMatch(ParameterInfo[] parameters, Type[] parameterTypes)
        {
            if (parameterTypes == null)
                parameterTypes = EmptyTypes;

            if (parameters.Length != parameterTypes.Length)
                return false;

            return !parameters.Where((t, i) => t.ParameterType != parameterTypes[i]).Any();
        }
예제 #3
0
        /// <summary>
        /// Collect the arguments from given parameter types.
        /// </summary>
        /// <param name="dependencyResolver">The depenency resolver.</param>
        /// <param name="parameters">The parameters.</param>
        /// <param name="resolutionContext">The resolution context.</param>
        /// <returns>The collected arguments.</returns>
        public object[] CollectArguments(Func<Type, object> dependencyResolver, ParameterInfo[] parameters, ResolutionContext resolutionContext)
        {
            var finalArguments = new List<object>();

            var dependencyParameters =
                parameters.Where(
                    p =>
                    resolutionContext.RegistrationContainer.HasRegistration(p.ParameterType)
                    ||
                    resolutionContext.RegistrationContainer.IsSupportedByRegistrationSource(p.ParameterType));

            Func<object, ParameterInfo, bool> argumentSelector = (argument, parameter) => parameter.ParameterType.IsInstanceOfType(argument);

            var runtimeArguments = resolutionContext.RuntimeArguments;
            var arguments = resolutionContext.Arguments;

            // Priority from heighest: Runtime arguments -> named / anonymous, Arguments -> named / anonymous / depdendency parameters.
            foreach (ParameterInfo parameter in parameters)
            {
                ParameterInfo localParameter = parameter;

                if (runtimeArguments.NamedArguments != null && runtimeArguments.NamedArguments.ContainsKey(parameter.Name))
                {
                    finalArguments.Add(runtimeArguments.NamedArguments[parameter.Name]);
                    continue;
                }

                if (runtimeArguments.AnonymousArguments != null && runtimeArguments.AnonymousArguments.Any(argument => argumentSelector(argument, localParameter)))
                {
                    finalArguments.Add(runtimeArguments.AnonymousArguments.FirstOrDefault(argument => argumentSelector(argument, localParameter)));
                    continue;
                }

                if (arguments.NamedArguments != null && arguments.NamedArguments.ContainsKey(parameter.Name))
                {
                    finalArguments.Add(arguments.NamedArguments[parameter.Name]);
                    continue;
                }

                if (arguments.AnonymousArguments != null && arguments.AnonymousArguments.Any(argument => argumentSelector(argument, localParameter)))
                {
                    finalArguments.Add(arguments.AnonymousArguments.FirstOrDefault(argument => argumentSelector(argument, localParameter)));
                    continue;
                }

                if (dependencyParameters.Contains(parameter))
                {
                    finalArguments.Add(dependencyResolver(parameter.ParameterType));
                    continue;
                }
            }

            return finalArguments.ToArray();
        }
예제 #4
0
		//===========================================================================================
		private void WriteAttributeForEach(IndentedTextWriter writer, ParameterInfo[] allParameters)
		{
			ParameterInfo[] parameters = allParameters.Where(p => _GraphicsMagickNET.GetXsdAttributeType(p) != null).ToArray();
			if (parameters.Length == 0)
				return;

			parameters = parameters.OrderBy(p => p.Name).ToArray();

			writer.WriteLine("for each(XmlAttribute^ attribute in element->Attributes)");
			WriteStartColon(writer);

			if (parameters.DistinctBy(p => _GraphicsMagickNET.GetCppTypeName(p)).Count() == 1)
			{
				writer.Write("arguments[attribute->Name] = _Variables->GetValue<");
				writer.Write(_GraphicsMagickNET.GetCppTypeName(parameters[0]));
				writer.WriteLine(">(attribute);");
			}
			else
			{
				for (int i = 0; i < parameters.Length; i++)
				{
					string xsdName = _GraphicsMagickNET.GetXsdName(parameters[i]);

					if (i > 0)
						writer.Write("else ");

					writer.Write("if (attribute->Name == \"");
					writer.Write(xsdName);
					writer.WriteLine("\")");
					writer.Indent++;
					writer.Write("arguments[\"");
					writer.Write(xsdName);
					writer.Write("\"] = ");
					WriteGetAttributeValue(writer, _GraphicsMagickNET.GetCppTypeName(parameters[i]), xsdName);
					writer.Indent--;
				}
			}

			WriteEndColon(writer);
		}
예제 #5
0
    private void WriteAttributeForEach(ParameterInfo[] allParameters)
    {
      ParameterInfo[] parameters = allParameters.Where(p => MagickScriptTypes.GetXsdAttributeType(p) != null).ToArray();
      if (parameters.Length == 0)
        return;

      parameters = parameters.OrderBy(p => p.Name).ToArray();

      WriteLine("foreach (XmlAttribute attribute in element.Attributes)");
      WriteStartColon();

      if (parameters.DistinctBy(p => GetName(p)).Count() == 1)
      {
        Write("arguments[attribute.Name] = Variables.GetValue<");
        Write(GetName(parameters[0]));
        WriteLine(">(attribute);");
      }
      else
      {
        for (int i = 0; i < parameters.Length; i++)
        {
          string xsdName = MagickScriptTypes.GetXsdName(parameters[i]);

          if (i > 0)
            Write("else ");

          Write("if (attribute.Name == \"");
          Write(xsdName);
          WriteLine("\")");
          Indent++;
          Write("arguments[\"");
          Write(xsdName);
          Write("\"] = ");
          WriteGetAttributeValue(GetName(parameters[i]));
          Indent--;
        }
      }

      WriteEndColon();
    }
		/// <summary>
		/// Copies fields from the temporary output parameters structure to the output parameters object specified by the caller.
		/// </summary>
		/// <param name="parameters">The list of parameters.</param>
		/// <param name="parameterWrapper">The local variable for the temporary object.</param>
		/// <param name="mIL">The ILGenerator to use.</param>
		private static void EmitOutputParameters(ParameterInfo[] parameters, LocalBuilder parameterWrapper, ILGenerator mIL)
		{
			foreach (var outputParameter in parameters.Where(p => p.IsOut))
			{
				mIL.Emit(OpCodes.Ldarg, outputParameter.Position + 1);
				mIL.Emit(OpCodes.Ldloc, parameterWrapper.LocalIndex);
				var fields = parameterWrapper.LocalType.GetFields();
				mIL.Emit(OpCodes.Ldfld, fields[outputParameter.Position]);
				mIL.Emit(OpCodes.Stobj, outputParameter.ParameterType.GetElementType());
			}
		}
 private static bool ParametersMatch(ParameterInfo[] methodParameters, object[] parameters)
 {
     return methodParameters.Length == parameters.Length
         && !methodParameters.Where((mp, i) => !mp.ParameterType.IsInstanceOfType(parameters[i])).Any();
 }
예제 #8
0
		//===========================================================================================
		private void WriteElementForEach(IndentedTextWriter writer, ParameterInfo[] allParameters)
		{
			ParameterInfo[] parameters = allParameters.Where(p => _GraphicsMagickNET.GetXsdAttributeType(p) == null).ToArray();
			if (parameters.Length == 0)
				return;

			writer.WriteLine("for each(XmlElement^ elem in element->SelectNodes(\"*\"))");
			WriteStartColon(writer);

			if (parameters.DistinctBy(p => _GraphicsMagickNET.GetCppTypeName(p)).Count() == 1)
			{
				writer.Write("arguments[elem->Name] = ");
				WriteCreateMethod(writer, _GraphicsMagickNET.GetCppTypeName(parameters[0]));
				writer.WriteLine("(elem);");
			}
			else
			{
				for (int i = 0; i < parameters.Length; i++)
				{
					string xsdName = _GraphicsMagickNET.GetXsdName(parameters[i]);

					if (i > 0)
						writer.Write("else ");

					writer.Write("if (elem->Name == \"");
					writer.Write(xsdName);
					writer.WriteLine("\")");
					writer.Indent++;
					writer.Write("arguments[\"");
					writer.Write(xsdName);
					writer.Write("\"] = ");
					WriteCreateMethod(writer, _GraphicsMagickNET.GetCppTypeName(parameters[i]));
					writer.WriteLine("(elem);");
					writer.Indent--;
				}
			}

			WriteEndColon(writer);
		}
예제 #9
0
    private void WriteElementForEach(ParameterInfo[] allParameters)
    {
      ParameterInfo[] parameters = allParameters.Where(p => MagickScriptTypes.GetXsdAttributeType(p) == null).ToArray();
      if (parameters.Length == 0)
        return;

      WriteLine("foreach (XmlElement elem in element.SelectNodes(\"*\"))");
      WriteStartColon();

      if (parameters.DistinctBy(p => GetName(p)).Count() == 1)
      {
        Write("arguments[elem.Name] = ");
        WriteCreateMethod(GetName(parameters[0]));
        WriteLine("(elem);");
      }
      else
      {
        for (int i = 0; i < parameters.Length; i++)
        {
          string xsdName = MagickScriptTypes.GetXsdName(parameters[i]);

          if (i > 0)
            Write("else ");

          Write("if (elem.Name == \"");
          Write(xsdName);
          WriteLine("\")");
          Indent++;
          Write("arguments[\"");
          Write(xsdName);
          Write("\"] = ");
          WriteCreateMethod(GetName(parameters[i]));
          WriteLine("(elem);");
          Indent--;
        }
      }

      WriteEndColon();
    }
예제 #10
0
 protected override ParameterInfo[] PrepareParams(ParameterInfo[] parameters)
 {
     return parameters.Where(p => p.ParameterType != typeof(System.Web.Mvc.FormCollection) && !p.ParameterType.IsSubclassOf(typeof(System.Web.Mvc.FormCollection))).ToArray();
 }