public static SerializerPair? TryGet()

in rd-net/RdFramework.Reflection/BuiltInSerializers.cs [150:214]


    public static SerializerPair? TryGet(TypeInfo typeInfo, Func<Type, SerializerPair> getInstanceSerializer, BuiltInType? type = null)
    {
      var serType = type ?? GetBuiltInType(typeInfo);

      switch (serType)
      {
        case BuiltInType.None:
        {
          return null;
        }
        case BuiltInType.StaticFields:
        {
          return GetPairFromFields(typeInfo);
        }
        case BuiltInType.StaticProtocolMethods:
        {
          var staticRead = GetReadStaticProtocolMethod(typeInfo);
          var staticWrite = GetWriteProtocolStaticMethod(typeInfo);
          return SerializerPair.CreateFromMethods(staticRead, staticWrite);
        }
        case BuiltInType.ProtocolMethods:
        {
          var staticRead = GetReadStaticProtocolMethod(typeInfo);
          var staticWrite = GetWriteProtocolMethod(typeInfo);
          return SerializerPair.CreateFromMethods(staticRead, staticWrite);
          }
        case BuiltInType.StaticMethods:
        {
          var staticRead = GetReadStaticMethod(typeInfo);
          var staticWrite = GetWriteStaticMethod(typeInfo);
          return SerializerPair.CreateFromNonProtocolMethods(staticRead, staticWrite);
        }
        case BuiltInType.Methods:
        {
          var staticRead = GetReadStaticMethod(typeInfo);
          var write = GetWriteMethod(typeInfo);
          return SerializerPair.CreateFromNonProtocolMethods(staticRead, write);
        }
        case BuiltInType.MarshallerAttribute:
        {
          var marshallerType = typeInfo.GetCustomAttribute<RdScalarAttribute>().NotNull().Marshaller.NotNull("Marshaller cannot be null");
          var marshaller = Activator.CreateInstance(marshallerType);
          return (SerializerPair?)ReflectionUtil.InvokeStaticGeneric(typeof(SerializerPair), nameof(SerializerPair.FromMarshaller), typeInfo, marshaller);
        }
        case BuiltInType.ProtocolCollectionLike1:
        {
          var genericArguments = typeInfo.GetGenericArguments();
          var argument = genericArguments[0];
          var read = GetReadStaticSerializer(typeInfo, argument);
          var write = GetWriteProtocolStaticMethod(typeInfo);
          return SerializerPair.CreateFromMethods(read, write, getInstanceSerializer(argument));
        }
        case BuiltInType.ProtocolCollectionLike2:
        {
          var genericArguments = typeInfo.GetGenericArguments();
          var key = genericArguments[0];
          var value = genericArguments[1];
          var read = GetReadStaticSerializer(typeInfo, key, value);
          var write = GetWriteProtocolStaticMethod(typeInfo);
          return SerializerPair.CreateFromMethods(read, write, getInstanceSerializer(key), getInstanceSerializer(value));
        }
        default:
          throw new ArgumentOutOfRangeException();
      }
    }