using System.Linq.Expressions; using System.Reflection; namespace Connected.Interop { public static class Nullables { public static bool IsNullableType(this Type type) { return type is not null && type.GetTypeInfo().IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>); } public static bool IsNullAssignable(this Type type) { return !type.GetTypeInfo().IsValueType || type.IsNullableType(); } public static Type GetNonNullableType(this Type type) { if (type.IsNullableType()) return type.GetTypeInfo().GenericTypeArguments[0]; return type; } public static Type GetNullAssignableType(this Type type) { if (!type.IsNullAssignable()) return typeof(Nullable<>).MakeGenericType(type); return type; } public static ConstantExpression GetNullConstant(this Type type) { return Expression.Constant(null, type.GetNullAssignableType()); } } }