public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var typeArgs = objectType.GenericTypeArguments; if (reader.TokenType == JsonToken.Null) { var concreteType = OptionType.MakeGenericType(typeArgs); return(concreteType.GetField(Empty).GetValue(null)); } var paramType = typeArgs[0]; var value = serializer.Deserialize(reader, paramType); return(Some.MakeGenericMethod(paramType).Invoke(null, new [] { value })); }