// 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); }
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)); }
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()); }