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