There are many solutions on the net for avoiding the null check. Here is mine:
public interface Option<T> { } public struct Nothing<T> : Option<T> { } public struct Just<T> : Option<T> { public readonly T Value; public Just(T value) { Value = value; } } public static class OptionExtentions { public static Option<T> ToOption<T>(this T value) { return (value == null) ? new Nothing<T>() as Option<T> : new Just<T>(value); } public static U Select<T, U>(this Option<T> option, Func<T, U> func) { return option.Select(func, () => default(U)); } public static U Select<T, U>(this Option<T> option, Func<T, U> whereJust, Func<U> whereNothing) { return option is Just<T> ? whereJust(((Just<T>)option).Value) : whereNothing(); } }
And implementation:
return (from h in HttpContext.Current.ToOption() select h.User);
Leave a comment