예제 #1
0
        // Public Methods 

        /// <summary>
        /// Sprawdza czy sekwencja dostępnych argumentów pasuje do parametrów metody
        /// </summary>
        /// <param name="givenArgumentsTypes">tablica typów dostępnych wartości</param>
        /// <param name="parameters">parametry metody</param>
        /// <param name="isExtensionMethod">czy metoda jest extension - wtedy pomijamy sprawdzanie pierwszego parametru i sprawdzamy pierwszy argument z drugim parametrem, 2 z 3, 3 z 4 itp</param>
        /// <param name="lastParameterAsSequence">jeśli <c>true</c> wtedy traktujemy ostatni parametr jako tablicę, która akceptuje zmienną ilość parametrów</param>
        /// <param name="useImplicitOperator">jeśli true to przy sprawdzaniu czy argumenty pasują prubujemy je także rzutować przy pomocy niejawnego rzutowania</param>
        /// <returns>true jeśli da się dopasować</returns>
        public static bool CheckParametesType(Type[] givenArgumentsTypes, ParameterInfo[] parameters, bool isExtensionMethod, bool lastParameterAsSequence, bool useImplicitOperator)
        {
            var availableParameterCount = givenArgumentsTypes.Length;
            var lastParamIdx            = parameters.Length - 1;

            for (var idx = 0; idx < availableParameterCount; idx++)
            {
                Type given, required;
                {
                    given = givenArgumentsTypes[idx];
                    var paramIdx = Math.Min(isExtensionMethod ? idx + 1 : idx, lastParamIdx);
                    required = parameters[paramIdx].ParameterType;
                    if (lastParameterAsSequence && paramIdx == lastParamIdx)
                    {
                        if (required.IsArray)
                        {
                            required = required.GetElementType();
                        }
                        else
                        {
                            throw new Exception("dirty boa");
                        }
                    }
                }
                if (!TypesUtil.IsAssignableFrom(required, given, useImplicitOperator))
                {
                    return(false);
                }
            }
            return(true);
        }
예제 #2
0
        public static string AAA(MethodInfo mi)
        {
            var           p = mi.GetParameters();
            List <object> o = new List <object>();

            o.Add(mi.IsStatic ? "static" : "instance");
            o.Add(mi.IsSpecialName ? "special" : "normal");
            o.Add(TypesUtil.TypeToString(mi.DeclaringType));
            o.Add(TypesUtil.TypeToString(mi.ReflectedType));
            o.Add(mi.Name);
            o.Add(p.Length);

            o.Add(TypesUtil.TypeToString(mi.ReturnType));
            foreach (var i in p)
            {
                o.Add(i.Name);
                o.Add(TypesUtil.TypeToString(i.ParameterType));
            }
            return(string.Join("\t", o));
        }
예제 #3
0
        public static string GetMethodHeader(this MethodInfo method)
        {
            var builder = new StringBuilder();

            builder.Append(GetVisibility(method.IsPublic, method.IsPrivate) + " ");
            builder.Append(TypesUtil.TypeToString(method.ReturnType) + " ");
            builder.Append(method.Name);
            builder.Append("(");
            bool addC = false;

            foreach (var a in method.GetParameters())
            {
                if (a.IsDefined(typeof(ParamArrayAttribute)))
                {
                    builder.Append("params ");
                }
                if (addC)
                {
                    builder.Append(", ");
                }
                addC = true;
                if (a.IsOut)
                {
                    builder.Append("out ");
                }
                else if (a.IsRetval)
                {
                    builder.AppendFormat("ref");
                }
                builder.AppendFormat("{0} {1}", TypesUtil.TypeToString(a.ParameterType), a.Name);
                if (a.HasDefaultValue)
                {
                    builder.AppendFormat(" = {0}", TypesUtil.CSValueToString(a.DefaultValue));
                }
            }
            builder.Append(")");
            return(builder.ToString());
        }