Beispiel #1
0
        public MethodInfoEx(MethodInfo method, bool enableDelegateCaching = true)
        {
            this.MethodInfo = method ?? throw new ArgumentNullException(nameof(method));

            if (method.ContainsGenericParameters)
            {
                throw new ArgumentException("Dynamix MethodInfoEx wrappers do not support generic parameters");
            }

            this.IsExtension = method.IsExtension();
            parameters       = method.GetParameters().Select((parameter, index) => (parameter, index)).ToDictionary(x => x.parameter.Name ?? $"<unnamed_param{x.index}>", x => x.parameter);
            this.Signature   = new ReadOnlyCollection <Type>(parameters.Values.Select(x => x.ParameterType).ToList());

            if (enableDelegateCaching)
            {
                instanceInvoker = MemberAccessorDelegateBuilder.CachedMethodBuilder.BuildGenericInstance(method);
                if (method.IsStatic)
                {
                    staticInvoker = MemberAccessorDelegateBuilder.CachedMethodBuilder.BuildGenericStatic(method);
                }
            }
            else
            {
                var builder = new MethodInvokerLambdaBuilder(false);
                instanceInvoker = builder.BuildGenericInstance(method).Compile();
                if (method.IsStatic)
                {
                    staticInvoker = builder.BuildGenericStatic(method).Compile();
                }
            }
        }
        public void TestGenericMethodBuilders()
        {
            var test = new TestTargetClass()
            {
                FirstName = "Jim", LastName = "Beam"
            };
            var testa = new TestTargetClass()
            {
                FirstName = "Jim Beam", LastName = ""
            };
            var testb = new TestTargetClass()
            {
                FirstName = "", LastName = "Jim Beam"
            };
            var builder = new MethodInvokerLambdaBuilder();

            var m = (GenericInstanceInvoker)builder.BuildGenericInstance(typeof(TestTargetClass).GetMethod("GenericFoo").MakeGenericMethodCached(new Type[] { typeof(TestTargetClass) })).Compile();
            var r = m.Invoke(test, testa, testb);

            Assert.IsTrue((bool)r);

            var mt = builder.BuildFuncInstance <TestTargetClass, TestTargetClass, TestTargetClass, bool>(typeof(TestTargetClass).GetMethod("GenericFoo").MakeGenericMethodCached(new Type[] { typeof(TestTargetClass) })).Compile();
            var rt = mt.Invoke(test, testa, testb);

            Assert.IsTrue(rt);
        }
        public void TestWrongUsage()
        {
            var extm = typeof(List <int>).GetExtensionsMethods(AssemblyReflector.GetLoadedAssemblies()).ToList();
            var enumerableSumMethod = extm.Where(x => x.Name == "Sum" && !x.IsGenericMethod).FirstOrDefault();
            var builder             = new MethodInvokerLambdaBuilder();

            //Assert.Throws<ArgumentNullException>(() => MethodInvokerBuilder<object>.BuildGenericInvoker(null));
            Assert.Throws <ArgumentNullException>(() => builder.BuildFromTypes(null));

            Assert.Throws <ArgumentException>(() => builder.BuildGenericStatic(typeof(TestTargetClass).GetMethod("VoidFoo")));
            //Assert.Throws<ArgumentException>(() => builder.BuildGenericExtension(typeof(TestTargetClass).GetMethod("Foo")));
            Assert.Throws <ArgumentException>(() => builder.BuildGenericStatic(typeof(TestTargetClass).GetMethod("Foo")));
            //Assert.Throws<ArgumentException>(() => builder.BuildGenericInstance(typeof(TestTargetClass).GetMethod("StaticFoo")));
            //Assert.Throws<ArgumentException>(() => MethodInvokerBuilder<object>.BuildInvoker(typeof(TestTargetClass).GetMethod("Foo"), true));

            //Assert.Throws<ArgumentException>(() => builder.BuildTypedInvokerExpression(typeof(TestTargetClass).GetMethod("Foo")));
            //Assert.Throws<ArgumentException>(() => builder.BuildTypedInvokerExpression(typeof(TestTargetClass).GetMethod("VoidFoo"),typeof(TestTargetClass),new[] { typeof(int), typeof(int) }, typeof(int))); //<Func<TestTargetClass, int, int, int>>
            //Assert.Throws<ArgumentException>(() => builder.BuildTypedInvokerExpression(enumerableSumMethod,null,new[] { typeof(int), typeof(int) }, typeof(bool))); //Func<int, int, bool>
            //Assert.Throws<ArgumentException>(() => builder.BuildTypedInvokerExpression(typeof(TestTargetClass).GetMethod("StaticFoo"), typeof(IEnumerable<int>),new[] { typeof(int) })); //Func<IEnumerable<int>, int>
        }
Beispiel #4
0
 public MethodInvokerDelegateBuilder(bool enableCaching)
 {
     this.EnableCaching = enableCaching;
     builder            = new MethodInvokerLambdaBuilder(enableCaching);
 }
Beispiel #5
0
 public MethodInvokerDelegateBuilder()
 {
     builder = new MethodInvokerLambdaBuilder(EnableCaching);
 }
        public void TestNonGenericMethodBuilders()
        {
            var extm = typeof(List <int>).GetExtensionsMethods(AssemblyReflector.GetLoadedAssemblies()).ToList();
            var enumerableSumMethod = extm.Where(x => x.Name == "Sum" && !x.IsGenericMethod).FirstOrDefault();
            var enumerableAddMethod = extm.Where(x => x.Name == "Add").FirstOrDefault();
            var l = new List <int>()
            {
                1, 2, 3
            };

            var extmethods    = typeof(TestTargetClass).GetExtensionsMethods();
            var extmethod     = extmethods.Where(x => x.Name == nameof(TargetTestClassExtensions.StaticExtensionFoo)).FirstOrDefault();
            var extmethodvoid = extmethods.Where(x => x.Name == nameof(TargetTestClassExtensions.StaticExtensionFooVoid)).FirstOrDefault();


            //var m1 = MethodInvokerBuilder.BuildInstanceInvoker(typeof(TestTargetClass).GetMethod("VoidFoo"));
            //var m2 = MethodInvokerBuilder.BuildInstanceInvoker(typeof(TestTargetClass).GetMethod("Foo"));
            //var m3 = MethodInvokerBuilder.BuildStaticInvoker(typeof(TestTargetClass).GetMethod("StaticFoo"));
            //var m4 = MethodInvokerBuilder.BuildExtensionAsInstanceInvoker(extmethod);
            //var m5 = MethodInvokerBuilder.BuildStaticInvoker(extmethod);
            //var m6 = MethodInvokerBuilder.BuildStaticInvoker(extmethodvoid);
            //var m7 = MethodInvokerBuilder.BuildExtensionAsInstanceInvoker(extmethodvoid);

            var builder = new MethodInvokerLambdaBuilder();
            var m1      = (GenericInstanceInvoker)builder.BuildGenericInstance(typeof(TestTargetClass).GetMethod("VoidFoo")).Compile();
            var m2      = (GenericInstanceInvoker)builder.BuildGenericInstance(typeof(TestTargetClass).GetMethod("Foo")).Compile();
            var m3      = (GenericStaticInvoker)builder.BuildGenericStatic(typeof(TestTargetClass).GetMethod("StaticFoo")).Compile();
            var m3b     = (GenericInstanceInvoker)builder.BuildGenericInstance(typeof(TestTargetClass).GetMethod("StaticFoo")).Compile();
            var m4      = (GenericInstanceInvoker)builder.BuildGenericInstance(extmethod).Compile();
            var m5      = (GenericStaticInvoker)builder.BuildGenericStatic(extmethod).Compile();
            var m6      = (GenericStaticInvoker)builder.BuildGenericStatic(extmethodvoid).Compile();
            var m7      = (GenericInstanceInvoker)builder.BuildGenericInstance(extmethodvoid).Compile();

            var e8 = builder.BuildGenericInstance(extmethodvoid);
            var d1 = (GenericInstanceInvoker)e8.CompileCached();
            var d2 = (GenericInstanceInvoker)e8.CompileCached();
            var d3 = (GenericInstanceInvoker)e8.CompileCached();
            var d4 = (GenericInstanceInvoker)e8.Compile();

            Assert.IsTrue((d1 == d2) && (d2 == d3));
            Assert.IsTrue(d4 != d1);


            var o         = new TestTargetClass();
            var nameValue = "Jim";
            var dateValue = DateTime.Now;
            var r1        = m1.Invoke(o, nameValue, dateValue);

            Assert.IsTrue(r1 == null && o.FirstName == nameValue && o.DOB == dateValue);

            var r2 = m2.Invoke(o, 2, 3);

            Assert.IsTrue(r2.GetType() == typeof(int) && (int)r2 == 5);

            var r3 = m3.Invoke(2, 2);

            Assert.IsTrue(r3 != null && r3.Equals(true));
            var r3b = m3b.Invoke(null, 3, 3);

            Assert.IsTrue(r3b != null && r3b.Equals(true));

            var r4 = m4.Invoke(o, nameValue);

            Assert.IsTrue(r4 != null && r4.Equals(true));

            var r5 = m5.Invoke(o, nameValue);

            Assert.IsTrue(r5 != null && r5.Equals(true));

            o.FirstName = "";
            var r6 = m6.Invoke(o, nameValue);

            Assert.IsTrue(r6 == null && o.FirstName.Equals(nameValue));

            o.FirstName = "";
            var r7 = m7.Invoke(o, nameValue);

            Assert.IsTrue(r7 == null && o.FirstName.Equals(nameValue));


            var m1t = builder.BuildFromDelegate <Action <TestTargetClass, string, DateTime> >(typeof(TestTargetClass).GetMethod("VoidFoo")).Compile();
            var m2t = builder.BuildFuncInstance <TestTargetClass, int, int, int>(typeof(TestTargetClass).GetMethod("Foo")).Compile();
            var m3t = builder.BuildFromDelegate <Func <int, int, bool> >(typeof(TestTargetClass).GetMethod("StaticFoo")).Compile();
            //var m4t = builder.BuildFuncInstance<IEnumerable<int>, int>(enumerableSumMethod).Compile();
            var m4t = builder.BuildFuncStatic <IEnumerable <int>, int>(enumerableSumMethod).Compile();

            var m2td = builder.BuildFromTypes(typeof(TestTargetClass).GetMethod("Foo")).Compile();
            var m3td = builder.BuildFromTypes(typeof(TestTargetClass).GetMethod("StaticFoo")).Compile();

            o = new TestTargetClass();
            var r1t = m1.Invoke(o, nameValue, dateValue);

            Assert.IsTrue(o.FirstName == nameValue && o.DOB == dateValue);

            var r2t = m2t.Invoke(o, 2, 3);

            Assert.IsTrue(r2t == 5);

            var r3t = m3t.Invoke(2, 2);

            Assert.IsTrue(r3t);

            var r4t = m4t.Invoke(l);

            Assert.IsTrue(r4t == 6);

            var r2td = m2td.DynamicInvoke(o, 2, 3);

            Assert.IsTrue((int)r2td == 5);

            var r3td = m3td.DynamicInvoke(2, 2);

            Assert.IsTrue((bool)r3td);

            var ctorBuilder = new ConstructorInvokerLambdaBuilder();
            var ctors       = typeof(TestTargetClass).GetConstructors();
            var ctor1       = ctors.First();
            var ctor2       = ctors.Skip(1).First();

            var c1 = ((Expression <Func <TestTargetClass> >)ctorBuilder.BuildFromTypes(ctor1)).Compile().Invoke();

            Assert.True(c1 != null && c1.GetType() == typeof(TestTargetClass));

            var c2 = ((Expression <Func <string, TestTargetClass> >)ctorBuilder.BuildFromTypes(ctor2)).Compile().Invoke("test");

            Assert.True(c2 != null && c2.GetType() == typeof(TestTargetClass) && c2.FirstName == "test");

            var ctorBuilder2 = new ConstructorInvokerLambdaBuilder();
            var ctors2       = typeof(TestTargetClass).GetConstructors();
            var ctor12       = ctors2.First();
            var m11          = ctorBuilder.BuildFromTypes(ctor12);
        }