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());
        }