@@ -1262,31 +1262,23 @@ private static void AddInterface(List<Type> types, Type type)
12621262 }
12631263 }
12641264
1265- private class MethodData
1266- {
1267- public MethodBase MethodBase ;
1268- public ParameterInfo [ ] Parameters ;
1269- public Expression [ ] PromotedParameters ;
1270- public bool HasParamsArray ;
1271- }
1272-
1273- private MethodData [ ] FindBestMethod ( IEnumerable < MethodBase > methods , Expression [ ] args )
1265+ private static MethodData [ ] FindBestMethod ( IEnumerable < MethodBase > methods , Expression [ ] args )
12741266 {
12751267 var applicable = methods .
12761268 Select ( m => new MethodData { MethodBase = m , Parameters = m . GetParameters ( ) } ) .
12771269 Where ( m => CheckIfMethodIsApplicableAndPrepareIt ( m , args ) ) .
12781270 ToArray ( ) ;
12791271 if ( applicable . Length > 1 )
12801272 {
1281- applicable = applicable .
1273+ return applicable .
12821274 Where ( m => applicable . All ( n => m == n || MethodHasPriority ( args , m , n ) ) ) .
12831275 ToArray ( ) ;
12841276 }
12851277
12861278 return applicable ;
12871279 }
12881280
1289- private bool CheckIfMethodIsApplicableAndPrepareIt ( MethodData method , Expression [ ] args )
1281+ private static bool CheckIfMethodIsApplicableAndPrepareIt ( MethodData method , Expression [ ] args )
12901282 {
12911283 if ( method . Parameters . Length > args . Length )
12921284 return false ;
@@ -1374,41 +1366,48 @@ private bool CheckIfMethodIsApplicableAndPrepareIt(MethodData method, Expression
13741366 {
13751367 var methodInfo = ( MethodInfo ) method . MethodBase ;
13761368
1377- var genericArgsType = ExtractActualGenericArguments (
1378- method . Parameters . Select ( p => p . ParameterType ) . ToArray ( ) ,
1379- method . PromotedParameters . Select ( p => p . Type ) . ToArray ( ) ) ;
1369+ var actualGenericArgs = ExtractActualGenericArguments (
1370+ method . Parameters . Select ( p => p . ParameterType ) . ToArray ( ) ,
1371+ method . PromotedParameters . Select ( p => p . Type ) . ToArray ( ) ) ;
13801372
1381- method . MethodBase = methodInfo . MakeGenericMethod ( genericArgsType . ToArray ( ) ) ;
1373+ var genericArgs = methodInfo . GetGenericArguments ( )
1374+ . Select ( p => actualGenericArgs [ p . Name ] )
1375+ . ToArray ( ) ;
1376+
1377+ method . MethodBase = methodInfo . MakeGenericMethod ( genericArgs ) ;
13821378 }
13831379
13841380 return true ;
13851381 }
13861382
1387- private List < Type > ExtractActualGenericArguments ( Type [ ] requestedParameters , Type [ ] actualParameters )
1383+ private static Dictionary < string , Type > ExtractActualGenericArguments (
1384+ Type [ ] methodGenericParameters ,
1385+ Type [ ] methodActualParameters )
13881386 {
1389- var extractedGenericTypes = new List < Type > ( ) ;
1387+ var extractedGenericTypes = new Dictionary < string , Type > ( ) ;
13901388
1391- for ( var i = 0 ; i < requestedParameters . Length ; i ++ )
1389+ for ( var i = 0 ; i < methodGenericParameters . Length ; i ++ )
13921390 {
1393- var requestedType = requestedParameters [ i ] ;
1394- var actualType = actualParameters [ i ] ;
1391+ var requestedType = methodGenericParameters [ i ] ;
1392+ var actualType = methodActualParameters [ i ] ;
13951393
13961394 if ( requestedType . IsGenericParameter )
13971395 {
1398- extractedGenericTypes . Add ( actualType ) ;
1396+ extractedGenericTypes [ requestedType . Name ] = actualType ;
13991397 }
14001398 else if ( requestedType . ContainsGenericParameters )
14011399 {
14021400 var innerGenericTypes = ExtractActualGenericArguments ( requestedType . GetGenericArguments ( ) , actualType . GetGenericArguments ( ) ) ;
14031401
1404- extractedGenericTypes . AddRange ( innerGenericTypes ) ;
1402+ foreach ( var innerGenericType in innerGenericTypes )
1403+ extractedGenericTypes [ innerGenericType . Key ] = innerGenericType . Value ;
14051404 }
14061405 }
14071406
14081407 return extractedGenericTypes ;
14091408 }
14101409
1411- private Expression PromoteExpression ( Expression expr , Type type , bool exact )
1410+ private static Expression PromoteExpression ( Expression expr , Type type , bool exact )
14121411 {
14131412 if ( expr . Type == type ) return expr ;
14141413 if ( expr is ConstantExpression )
@@ -1440,70 +1439,6 @@ private Expression PromoteExpression(Expression expr, Type type, bool exact)
14401439 return null ;
14411440 }
14421441
1443- //object ParseNumber(string text, Type type)
1444- //{
1445- // switch (Type.GetTypeCode(GetNonNullableType(type)))
1446- // {
1447- // case TypeCode.SByte:
1448- // sbyte sb;
1449- // if (sbyte.TryParse(text, ParseLiteralNumberStyle, ParseCulture, out sb)) return sb;
1450- // break;
1451- // case TypeCode.Byte:
1452- // byte b;
1453- // if (byte.TryParse(text, ParseLiteralNumberStyle, ParseCulture, out b)) return b;
1454- // break;
1455- // case TypeCode.Int16:
1456- // short s;
1457- // if (short.TryParse(text, ParseLiteralNumberStyle, ParseCulture, out s)) return s;
1458- // break;
1459- // case TypeCode.UInt16:
1460- // ushort us;
1461- // if (ushort.TryParse(text, ParseLiteralUnsignedNumberStyle, ParseCulture, out us)) return us;
1462- // break;
1463- // case TypeCode.Int32:
1464- // int i;
1465- // if (int.TryParse(text, ParseLiteralNumberStyle, ParseCulture, out i)) return i;
1466- // break;
1467- // case TypeCode.UInt32:
1468- // uint ui;
1469- // if (uint.TryParse(text, ParseLiteralUnsignedNumberStyle, ParseCulture, out ui)) return ui;
1470- // break;
1471- // case TypeCode.Int64:
1472- // long l;
1473- // if (long.TryParse(text, ParseLiteralNumberStyle, ParseCulture, out l)) return l;
1474- // break;
1475- // case TypeCode.UInt64:
1476- // ulong ul;
1477- // if (ulong.TryParse(text, ParseLiteralUnsignedNumberStyle, ParseCulture, out ul)) return ul;
1478- // break;
1479- // case TypeCode.Single:
1480- // float f;
1481- // if (float.TryParse(text, ParseLiteralDecimalNumberStyle, ParseCulture, out f)) return f;
1482- // break;
1483- // case TypeCode.Double:
1484- // double d;
1485- // if (double.TryParse(text, ParseLiteralDecimalNumberStyle, ParseCulture, out d)) return d;
1486- // break;
1487- // case TypeCode.Decimal:
1488- // decimal e;
1489- // if (decimal.TryParse(text, ParseLiteralDecimalNumberStyle, ParseCulture, out e)) return e;
1490- // break;
1491- // }
1492- // return null;
1493- //}
1494-
1495- //static object ParseEnum(string name, Type type)
1496- //{
1497- // if (type.IsEnum)
1498- // {
1499- // MemberInfo[] memberInfos = type.FindMembers(MemberTypes.Field,
1500- // BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Static,
1501- // Type.FilterNameIgnoreCase, name);
1502- // if (memberInfos.Length != 0) return ((FieldInfo)memberInfos[0]).GetValue(null);
1503- // }
1504- // return null;
1505- //}
1506-
15071442 private static bool IsCompatibleWith ( Type source , Type target )
15081443 {
15091444 if ( source == target )
@@ -2113,7 +2048,7 @@ private void NextToken()
21132048 private string GetIdentifier ( )
21142049 {
21152050 ValidateToken ( TokenId . Identifier , ErrorMessages . IdentifierExpected ) ;
2116- string id = _token . text ;
2051+ var id = _token . text ;
21172052 if ( id . Length > 1 && id [ 0 ] == '@' )
21182053 id = id . Substring ( 1 ) ;
21192054 return id ;
@@ -2139,9 +2074,17 @@ private void ValidateToken(TokenId t)
21392074 throw CreateParseException ( _token . pos , ErrorMessages . SyntaxError ) ;
21402075 }
21412076
2142- private Exception CreateParseException ( int pos , string format , params object [ ] args )
2077+ private static Exception CreateParseException ( int pos , string format , params object [ ] args )
21432078 {
21442079 return new ParseException ( string . Format ( format , args ) , pos ) ;
21452080 }
2081+
2082+ private class MethodData
2083+ {
2084+ public MethodBase MethodBase ;
2085+ public ParameterInfo [ ] Parameters ;
2086+ public Expression [ ] PromotedParameters ;
2087+ public bool HasParamsArray ;
2088+ }
21462089 }
21472090}
0 commit comments