Skip to content

Instantly share code, notes, and snippets.

@badmotorfinger
Forked from bleroy/NotNull
Created July 2, 2014 11:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save badmotorfinger/48fefcd063ece42a0781 to your computer and use it in GitHub Desktop.
Save badmotorfinger/48fefcd063ece42a0781 to your computer and use it in GitHub Desktop.
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Reflection;
namespace Bleroy.Helpers {
public static class NotNull {
public static TProp Get<TSource, TProp>(this TSource source, Expression<Func<TSource, TProp>> property) where TSource : class {
if (source == null) return default(TProp);
var current = property.Body;
var properties = new List<PropertyInfo>();
while (!(current is ParameterExpression)) {
var memberExpression = current as MemberExpression;
if (memberExpression == null || !(memberExpression.Member is PropertyInfo)) {
throw new InvalidOperationException("All members in the expression must be properties.");
}
properties.Add((PropertyInfo)memberExpression.Member);
current = memberExpression.Expression;
}
properties.Reverse();
object currentValue = source;
foreach (var propertyInfo in properties) {
if (currentValue == null) return default(TProp);
currentValue = propertyInfo.GetValue(currentValue);
}
return (TProp) currentValue;
}
}
}
@badmotorfinger
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment