Ejemplo n.º 1
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"));
        }