コード例 #1
0
        public void SetUp()
        {
            _proxy     = MutableTypeObjectMother.Create();
            _addedCtor = _proxy.AddConstructor();

            _tracker = new ProxyTypeModificationTracker(_proxy, new[] { _addedCtor.Body });
        }
コード例 #2
0
        public static MutableConstructorInfo AddConstructor(
            this MutableType mutableType,
            MethodAttributes attributes = MethodAttributes.Public,
            IEnumerable <ParameterDeclaration> parameters = null,
            Func <ConstructorBodyCreationContext, Expression> bodyProvider = null)
        {
            parameters   = parameters ?? ParameterDeclaration.None;
            bodyProvider = bodyProvider ?? (ctx => Expression.Empty());

            return(mutableType.AddConstructor(attributes, parameters, bodyProvider));
        }
コード例 #3
0
 private MutableConstructorInfo AddConstructor(
     MutableType nextCallProxy, MutableType concreteTarget, Expression thisField, Expression depthField)
 {
     return(nextCallProxy.AddConstructor(
                MethodAttributes.Public,
                new[] { new ParameterDeclaration(concreteTarget, "this"), new ParameterDeclaration(typeof(int), "depth") },
                ctx =>
                Expression.Block(
                    ctx.CallBaseConstructor(),
                    Expression.Assign(thisField, ctx.Parameters[0]),
                    Expression.Assign(depthField, ctx.Parameters[1]))));
 }
コード例 #4
0
        public void DefineTypeFacets()
        {
            var typeInitializer = _mutableType.AddTypeInitializer(ctx => Expression.Empty());

            var instanceInitialization = ExpressionTreeObjectMother.GetSomeExpression();

            _mutableType.AddInitialization(ctx => instanceInitialization);

            var customAttribute = CustomAttributeDeclarationObjectMother.Create();

            _mutableType.AddCustomAttribute(customAttribute);

            var @interface = typeof(IDisposable);

            _mutableType.AddInterface(@interface);

            var field       = _mutableType.AddField();
            var constructor = _mutableType.AddConstructor();
            var method      = _mutableType.AddMethod();
            var property    = _mutableType.AddProperty();
            var event_      = _mutableType.AddEvent();

            using (_mockRepository.Ordered())
            {
                var context = PopulateContext(_generator, 2);

                _typeBuilderMock.Expect(mock => mock.SetParent(_mutableType.BaseType));

                _memberEmitterMock.Expect(mock => mock.AddConstructor(context, typeInitializer));

                _initializationBuilderMock.Expect(mock => mock.CreateInitializationMembers(_mutableType)).Return(_fakeInitializationMembers);
                _proxySerializationEnablerMock.Expect(mock => mock.MakeSerializable(_mutableType, _fakeInitializationMethod));

                _typeBuilderMock.Expect(mock => mock.SetCustomAttribute(customAttribute));
                _typeBuilderMock.Expect(mock => mock.AddInterfaceImplementation(@interface));
                _memberEmitterMock.Expect(mock => mock.AddField(context, field));
                _initializationBuilderMock.Expect(
                    mock => mock.WireConstructorWithInitialization(constructor, _fakeInitializationMembers, _proxySerializationEnablerMock));
                _memberEmitterMock.Expect(mock => mock.AddConstructor(context, constructor));
                _memberEmitterMock.Expect(mock => mock.AddMethod(context, method));
                SetupExpectationsForAccessors(_memberEmitterMock, _mutableType.AddedMethods.Except(new[] { method }));
                _memberEmitterMock.Expect(mock => mock.AddProperty(context, property));
                _memberEmitterMock.Expect(mock => mock.AddEvent(context, event_));
            }
            _mockRepository.ReplayAll();

            _generator.DefineTypeFacets();

            _mockRepository.VerifyAll();
        }
コード例 #5
0
        public void CreateConstructor_ThrowsIfAlreadyExists()
        {
            _mutableType.AddConstructor(parameters: ParameterDeclaration.None);

            Func <ConstructorBodyCreationContext, Expression> bodyProvider = ctx => Expression.Empty();

            Assert.That(
                () => _factory.CreateConstructor(_mutableType, 0, ParameterDeclarationObjectMother.CreateMultiple(2), bodyProvider),
                Throws.Nothing);

            Assert.That(
                () =>
                _factory.CreateConstructor(_mutableType, MethodAttributes.Static, ParameterDeclaration.None, bodyProvider),
                Throws.Nothing);

            Assert.That(
                () => _factory.CreateConstructor(_mutableType, 0, ParameterDeclaration.None, bodyProvider),
                Throws.InvalidOperationException.With.Message.EqualTo("Constructor with equal signature already exists."));
        }
コード例 #6
0
        private static MutableConstructorInfo CopyConstructor(MutableType proxyType, MethodAttributes attributes, ConstructorInfo constructor)
        {
            var parameters = constructor.GetParameters().Select(p => new ParameterDeclaration(p.ParameterType, p.Name, p.Attributes));

            return(proxyType.AddConstructor(attributes, parameters, ctx => ctx.CallBaseConstructor(ctx.Parameters)));
        }