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