using Newtonsoft.Json; namespace System.Extensions; public static class ObjectExtensions { public static T? Deserialize(this string serialized) where T : class { if (serialized.IsNullOrWhiteSpace()) { throw new ArgumentException("Provided serialized string cannot be null or whitespace", nameof(serialized)); } return JsonConvert.DeserializeObject(serialized); } public static string Serialize(this T obj) where T : class { if (obj is null) { throw new ArgumentNullException(nameof(obj)); } return JsonConvert.SerializeObject(obj); } public static T Cast(this object obj) { return (T)obj; } public static T? As(this object obj) where T : class { return obj as T; } public static Optional ToOptional(this T obj) { return Optional.FromValue(obj); } public static T ThrowIfNull([ValidatedNotNull] this T obj, string name) where T : class { if (obj is null) { throw new ArgumentNullException(name); } return obj; } [AttributeUsage(AttributeTargets.Parameter)] sealed class ValidatedNotNullAttribute : Attribute { } }