Ancestry.Daisy.Statements.StaticAnalysis.CreateConverter C# (CSharp) Method

CreateConverter() public static method

Converts a predicate of Func to Func of the given type.
public static CreateConverter ( Type destType ) : TransformPredicate
destType System.Type Type of the dest.
return TransformPredicate
        public static TransformPredicate CreateConverter(Type destType)
        {
            // This essentially creates the following lambda, but uses destType instead of T
            // private static Func<Func<object, bool>, Func<T, bool>> Transform<T>()
            // {
            //     return (Func<object,bool> input) => ((T x) => input(x));
            // }
            var input = Expression.Parameter(typeof(Func<object, bool>), "input");

            var x = Expression.Parameter(destType, "x");
            var convert = Expression.Convert(x, typeof(object));
            var callInputOnX = Expression.Invoke(input, convert);
            var body2 = Expression.Lambda(callInputOnX, x);
            var body1 = Expression.Lambda(typeof(TransformPredicate),body2, input);
            var compiled = body1.Compile();
            return (TransformPredicate)compiled;
            /*
            var destFunc = typeof(Func<,>).MakeGenericType(destType, typeof(bool));
            var endType = typeof(Func<,>).MakeGenericType(typeof(Func<object, bool>), destFunc);
            return (TransformPredicate)compiled.Method.CreateDelegate(endType);
            */
        }

Usage Example

Beispiel #1
0
            private void PrecacheReflections(Type controllerType)
            {
                var defaultConstructor = controllerType.GetConstructors().FirstOrDefault(x => x.GetParameters().Length == 0);

                if (defaultConstructor == null)
                {
                    throw new ArgumentException("StatementHandler " + controllerType.Name + " does not have a default constructor");
                }
                activator = FastFlect.GetActivator(defaultConstructor);
                delegateForScopeSetter       = controllerType.DelegateForSetPropertyValue("Scope");
                delegateForContextSetter     = controllerType.DelegateForSetPropertyValue("Context");
                delegateForAttachmentsSetter = controllerType.DelegateForSetPropertyValue("Attachments");
                delegateForTracerSetter      = controllerType.DelegateForSetPropertyValue("Tracer");
                delegateForInvokation        = definition.MethodInfo.DelegateForCallMethod();
                if (definition.TransformsScopeTo != null)
                {
                    scopeConverter        = StaticAnalysis.CreateConverter(definition.TransformsScopeTo);
                    transformsToValueType = definition.TransformsScopeTo.IsValueType;
                }
            }