public static TValue Eval <TSource, TValue>(this TSource source, Expression <Func <TSource, TValue> > value) { var parameters = new Dictionary <string, object> { { value.Parameters.First().Name, source } }; var evaluator = new SafeExpressionEvaluator(value.Body, parameters); var result = evaluator.Evaluate(); if (result == null) { return(default(TValue)); } return((TValue)result); }
public static IPropertyDefinition Property <TProperty>(this IMicroModel model, Expression <Func <TProperty> > propertyGetter) { propertyGetter = Evaluator.EvaluateClosures(propertyGetter); var member = propertyGetter.GetOutermostMember(); var propertyInfo = (PropertyInfo)member.Member; var property = BuildProperty(model, propertyInfo.Name, typeof(TProperty)); var readEvaluator = new SafeExpressionEvaluator(propertyGetter.Body, new Dictionary <string, object>()); property.Getter = (x) => readEvaluator.Evaluate(); AddDependencies(property, propertyGetter); if (propertyInfo.CanWrite) { var writeEvaluator = new SafeExpressionEvaluator(member.Expression, new Dictionary <string, object>()); property.Setter = (x, y) => { var target = writeEvaluator.Evaluate(); propertyInfo.SetValue(target, y, null); }; } return(property); }