RpcUtil.cs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. using EdjCase.JsonRpc.Core.Utilities;
  2. using Newtonsoft.Json.Linq;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. namespace EdjCase.JsonRpc.Router.Utilities
  7. {
  8. public class RpcUtil
  9. {
  10. public static bool TypesMatch(object value, Type type)
  11. {
  12. Type nullableType = Nullable.GetUnderlyingType(type);
  13. if (nullableType != null)
  14. {
  15. type = nullableType;
  16. }
  17. if (value is JToken token)
  18. {
  19. switch (token.Type)
  20. {
  21. case JTokenType.Array:
  22. JArray jArray = (JArray)token;
  23. return type.IsArray
  24. || type.GetInterfaces()
  25. .Any(inter => inter.IsGenericType
  26. && inter.GetGenericTypeDefinition() == typeof(IEnumerable<>)
  27. && (!token.Any()
  28. || RpcUtil.TypesMatch(jArray.First(), inter.GenericTypeArguments[0])));
  29. case JTokenType.Boolean:
  30. return type == typeof(bool);
  31. case JTokenType.Bytes:
  32. return type == typeof(byte[]);
  33. case JTokenType.Date:
  34. return type == typeof(DateTime);
  35. case JTokenType.Guid:
  36. return type == typeof(Guid);
  37. case JTokenType.Float:
  38. return type.IsNumericType(includeInteger: false);
  39. case JTokenType.Integer:
  40. return type.IsNumericType();
  41. case JTokenType.Null:
  42. case JTokenType.Undefined:
  43. return nullableType != null || type.IsNullableType();
  44. case JTokenType.Object:
  45. return type.IsAssignableFrom(typeof(object));
  46. case JTokenType.Uri:
  47. return type == typeof(string)
  48. || type == typeof(Uri);
  49. case JTokenType.String:
  50. return type == typeof(string);
  51. case JTokenType.TimeSpan:
  52. return type == typeof(TimeSpan)
  53. || type == typeof(double)
  54. || type == typeof(decimal);
  55. default:
  56. return false;
  57. }
  58. }
  59. else
  60. {
  61. return value?.GetType() == type;
  62. }
  63. }
  64. }
  65. }