private static Action <CorrelationFilterTemplate, CorrelationFilter> BuildMapSystemPropertiesAction() { ParameterExpression parameterExpression = Expression.Parameter(typeof(CorrelationFilterTemplate), "template"); ParameterExpression parameterExpression1 = Expression.Parameter(typeof(CorrelationFilter), "filter"); List <Expression> expressions = new List <Expression>(); foreach (Tuple <PropertyInfo, CorrelationFilterTemplate.SystemPropertyMappingAttribute> tuple in CorrelationFilterTemplate.EnumerateSystemProperties()) { PropertyInfo item1 = tuple.Item1; CorrelationFilterTemplate.SystemPropertyMappingAttribute item2 = tuple.Item2; ParameterExpression parameterExpression2 = Expression.Variable(typeof(PropertyReference), "reference"); ParameterExpression parameterExpression3 = Expression.Variable(typeof(object), "possibleValue"); BinaryExpression binaryExpression = Expression.NotEqual(Expression.Property(parameterExpression, item1.Name), Expression.Constant(null)); ParameterExpression[] parameterExpressionArray = new ParameterExpression[] { parameterExpression2, parameterExpression3 }; Expression[] expressionArray = new Expression[] { Expression.Assign(parameterExpression2, Expression.TypeAs(Expression.Property(parameterExpression1, item1.Name), typeof(PropertyReference))), Expression.Assign(parameterExpression3, Expression.Condition(Expression.NotEqual(parameterExpression2, Expression.Constant(null)), Expression.Property(parameterExpression2, "Value"), Expression.Property(parameterExpression, item1.Name))), Expression.Assign(Expression.Property(parameterExpression1, item1.Name), Expression.Convert(parameterExpression3, item2.TargetType)) }; Expression expression = Expression.IfThen(binaryExpression, Expression.Block(parameterExpressionArray, expressionArray)); expressions.Add(expression); } BlockExpression blockExpression = Expression.Block(expressions); ParameterExpression[] parameterExpressionArray1 = new ParameterExpression[] { parameterExpression, parameterExpression1 }; return(Expression.Lambda <Action <CorrelationFilterTemplate, CorrelationFilter> >(blockExpression, parameterExpressionArray1).Compile()); }
private static Func <CorrelationFilterTemplate, IEnumerable <KeyValuePair <QualifiedPropertyName, object> > > BuildEnumerateSystemPropertiesFunction() { ParameterExpression parameterExpression = Expression.Parameter(typeof(CorrelationFilterTemplate), "template"); Type type = typeof(KeyValuePair <QualifiedPropertyName, object>); Type[] typeArray = new Type[] { typeof(QualifiedPropertyName), typeof(object) }; ConstructorInfo constructor = type.GetConstructor(typeArray); Type type1 = typeof(QualifiedPropertyName); Type[] typeArray1 = new Type[] { typeof(PropertyScope), typeof(string) }; ConstructorInfo constructorInfo = type1.GetConstructor(typeArray1); List <Expression> expressions = new List <Expression>(); foreach (Tuple <PropertyInfo, CorrelationFilterTemplate.SystemPropertyMappingAttribute> tuple in CorrelationFilterTemplate.EnumerateSystemProperties()) { PropertyInfo item1 = tuple.Item1; Expression[] expressionArray = new Expression[2]; Expression[] expressionArray1 = new Expression[] { Expression.Constant(PropertyScope.System), Expression.Constant(item1.Name) }; expressionArray[0] = Expression.New(constructorInfo, expressionArray1); expressionArray[1] = Expression.Property(parameterExpression, item1.Name); expressions.Add(Expression.New(constructor, expressionArray)); } Expression expression = Expression.ListInit(Expression.New(typeof(List <KeyValuePair <QualifiedPropertyName, object> >)), expressions); ParameterExpression[] parameterExpressionArray = new ParameterExpression[] { parameterExpression }; return(Expression.Lambda <Func <CorrelationFilterTemplate, IEnumerable <KeyValuePair <QualifiedPropertyName, object> > > >(expression, parameterExpressionArray).Compile()); }