public void TypedMethodInvocationWithComplexOwner()
        {
            FieldReference     fieldReference     = ClassEmitter.CreateField("CallTarget", typeof(ReferenceType));
            FieldInfoReference fieldInfoReference = new FieldInfoReference(SelfReference.Self, fieldReference.Reference);

            var method = GetMethodEmitter(false, typeof(string), new Type[0]);

            method.AddStatement(new AssignStatement(fieldReference, new NewInstanceExpression(typeof(ReferenceType), Type.EmptyTypes)));

            method.ImplementByReturning(new TypedMethodInvocationExpression(fieldInfoReference, typeof(ReferenceType).GetMethod("Method")));

            Assert.That(InvokeMethod(), Is.EqualTo("ReferenceTypeMethod"));
        }
        public void TypedMethodInvocationWithArguments()
        {
            FieldReference     fieldReference     = ClassEmitter.CreateField("CallTarget", typeof(ReferenceType));
            FieldInfoReference fieldInfoReference = new FieldInfoReference(SelfReference.Self, fieldReference.Reference);

            var method = GetMethodEmitter(false, typeof(Tuple <int, string>), new Type[0]);

            method.AddStatement(new AssignStatement(fieldReference, new NewInstanceExpression(typeof(ReferenceType), Type.EmptyTypes)));

            method.ImplementByReturning(new TypedMethodInvocationExpression(fieldInfoReference, typeof(ReferenceType).GetMethod("MethodWithArgs"),
                                                                            new ConstReference(1).ToExpression(), new ConstReference("2").ToExpression()));

            Assert.That(InvokeMethod(), Is.EqualTo(new Tuple <int, string> (1, "2")));
        }
        public void LoadAndStoreStatic()
        {
            FieldInfo fieldInfo     = typeof(ClassWithPublicFields).GetField("StaticReferenceTypeField");
            var       methodEmitter = GetMethodEmitter(false, typeof(string), new Type[0]);

            LocalReference     local          = methodEmitter.DeclareLocal(typeof(string));
            FieldInfoReference fieldReference = new FieldInfoReference(null, fieldInfo);

            methodEmitter
            .AddStatement(new AssignStatement(local, fieldReference.ToExpression()))
            .AddStatement(new AssignStatement(fieldReference, new ConstReference("Replacement").ToExpression()))
            .AddStatement(new ReturnStatement(local));

            Assert.That(ClassWithPublicFields.StaticReferenceTypeField, Is.EqualTo("InitialStatic"));
            Assert.That(InvokeMethod(), Is.EqualTo("InitialStatic"));
            Assert.That(ClassWithPublicFields.StaticReferenceTypeField, Is.EqualTo("Replacement"));
        }
        public void LoadAndStoreInstance()
        {
            FieldInfo fieldInfo     = typeof(ClassWithPublicFields).GetField("ReferenceTypeField");
            var       methodEmitter = GetMethodEmitter(false, typeof(string), new[] { typeof(ClassWithPublicFields) });

            LocalReference     local          = methodEmitter.DeclareLocal(typeof(string));
            FieldInfoReference fieldReference = new FieldInfoReference(methodEmitter.ArgumentReferences[0], fieldInfo);

            methodEmitter
            .AddStatement(new AssignStatement(local, fieldReference.ToExpression()))
            .AddStatement(new AssignStatement(fieldReference, new ConstReference("Replacement").ToExpression()))
            .AddStatement(new ReturnStatement(local));

            ClassWithPublicFields parameter = new ClassWithPublicFields();

            Assert.That(parameter.ReferenceTypeField, Is.EqualTo("Initial"));
            Assert.That(InvokeMethod(parameter), Is.EqualTo("Initial"));
            Assert.That(parameter.ReferenceTypeField, Is.EqualTo("Replacement"));
        }
示例#5
0
        public void ReplicateBaseTypeConstructors()
        {
            var classEmitter   = new CustomClassEmitter(Scope, "ReplicateBaseTypeConstructors", typeof(ClassWithReplicatableConstructors));
            var fieldReference = new FieldInfoReference(SelfReference.Self, typeof(ClassWithReplicatableConstructors).GetField("CtorString"));

            var concatMethod         = typeof(string).GetMethod("Concat", new[] { typeof(string), typeof(string) });
            var preConcatExpression  = new MethodInvocationExpression(null, concatMethod, fieldReference.ToExpression(), new ConstReference("pre").ToExpression());
            var postConcatExpression = new MethodInvocationExpression(null, concatMethod, fieldReference.ToExpression(), new ConstReference("post").ToExpression());

            classEmitter.ReplicateBaseTypeConstructors(
                emitter => emitter.CodeBuilder.AddStatement(new AssignStatement(fieldReference, preConcatExpression)),
                emitter => emitter.CodeBuilder.AddStatement(new AssignStatement(fieldReference, postConcatExpression)));

            Type builtType = classEmitter.BuildType();

            var instance1 = (ClassWithReplicatableConstructors)Activator.CreateInstance(builtType); // default ctor

            Assert.That(instance1.CtorString, Is.EqualTo("preClassWithReplicatableConstructors()post"));

            var instance2 = (ClassWithReplicatableConstructors)Activator.CreateInstance(builtType, 7); // int ctor

            Assert.That(instance2.CtorString, Is.EqualTo("preClassWithReplicatableConstructors(7)post"));
        }