// Static - Property Getter public static Expression <Func <TProperty> > StaticPropertyGetter <TClass, TProperty>(string propertyName) { Contract.Requires(propertyName.SafeHasContent()); var type = typeof(TClass); var propertyExpression = default(Expression); var propertyNameSplit = propertyName.Split('.'); foreach (var name in propertyNameSplit) { var propertyInfo = TypeReflection.GetProperty(type, name, ReflectionFlags.Public | ReflectionFlags.Static | ReflectionFlags.Instance); var isPropertyStatic = PropertyReflection.IsStatic(propertyInfo); propertyExpression = Expression.Property(isPropertyStatic ? null : propertyExpression, propertyInfo); type = propertyInfo.PropertyType; } var lambdaExpression = Expression.Lambda <Func <TProperty> >(propertyExpression); return(lambdaExpression); }
// Instance - Property Getter public static Expression <Func <TObject, TProperty> > PropertyGetter <TObject, TProperty>(string propertyName) { Contract.Requires(propertyName.SafeHasContent()); var type = typeof(TObject); var instanceExpression = Expression.Parameter(type, "x"); var propertyExpression = (Expression)instanceExpression; var propertyNameSplit = propertyName.Split('.'); foreach (var name in propertyNameSplit) { var propertyInfo = TypeReflection.GetProperty(type, name, ReflectionFlags.Public | ReflectionFlags.Instance | ReflectionFlags.Static); var isPropertyStatic = PropertyReflection.IsStatic(propertyInfo); propertyExpression = Expression.Property(!isPropertyStatic ? propertyExpression : null, propertyInfo); type = propertyInfo.PropertyType; } var lambdaExpression = Expression.Lambda <Func <TObject, TProperty> >(propertyExpression, instanceExpression); return(lambdaExpression); }