Exemplo n.º 1
0
        protected Type CreateProxyType(Type type)
        {
            if (type.GetConstructor(new Type[0]) == null)
            {
                throw new PatchProxyTypeException($"Type {type} doesn't have an empty constructor.");
            }

            RuntimeTypeBuilder proxyBuilder = new RuntimeTypeBuilder($"{{Guid.NewGuid()}}.{type.FullName}Patch", type);

            FieldBuilder modified      = proxyBuilder.DefineField("_modified", typeof(HashSet <string>), FieldAttributes.Private);
            var          modifiedField = Field(proxyBuilder.This, modified);

            foreach (PropertyInfo propInfo in type.GetRuntimeProperties())
            {
                if (propInfo.CanRead && propInfo.CanWrite && propInfo.GetSetMethod().IsVirtual)
                {
                    ParameterExpression valueExpr = Parameter(propInfo.PropertyType, "value");

                    var baseGet = Call(proxyBuilder.Base, propInfo.GetGetMethod());

                    proxyBuilder.OverrideMethod(propInfo.GetSetMethod(),
                                                new[] { valueExpr },
                                                If(NotEqual(baseGet, valueExpr),
                                                   Then(
                                                       If(IsNull(modifiedField),
                                                          Assign(modifiedField, New(typeof(HashSet <string>)))
                                                          ),
                                                       Call("Add", modifiedField, Constant(propInfo.Name)),
                                                       Call(proxyBuilder.Base, propInfo.SetMethod, valueExpr)
                                                       )
                                                   )
                                                );
                }
            }

            proxyBuilder.DefineMethod("Reset", null,
                                      Block(
                                          If(IsNotNull(modifiedField),
                                             Call("Clear", modifiedField)
                                             )
                                          )
                                      );

            var propNameParam = Parameter(typeof(string), "propName");

            proxyBuilder.DefineMethod("IsSet",
                                      new[] { propNameParam },
                                      Block(
                                          Variable("result", Constant(false), out Expression result),
                                          If(IsNotNull(modifiedField),
                                             Assign(result, Call("Contains", modifiedField, propNameParam))
                                             ),
                                          Result(result)
                                          )
                                      );

            proxyBuilder.AutoImplementInterface(typeof(IPatch));

            return(proxyBuilder.Create());
        }
Exemplo n.º 2
0
        public void call_base_method()
        {
            RuntimeTypeBuilder typeBuilder = new RuntimeTypeBuilder("CallBaseMethod", typeof(BaseMethodClass));
            MethodInfo         getTextInfo = typeof(BaseMethodClass).GetMethod("GetText");

            typeBuilder.OverrideMethod(getTextInfo,
                                       null,
                                       Call("Concat", typeof(string), Call(typeBuilder.Base, getTextInfo), Constant(" (overriden)"))
                                       );

            Type   newType     = typeBuilder.Create();
            object newInstance = Activator.CreateInstance(newType);

            MethodInfo testMethodInfo = newType.GetMethod("GetText");
            object     result         = testMethodInfo.Invoke(newInstance, null);

            Assert.Equal("this is the base class! (overriden)", result);
        }
Exemplo n.º 3
0
        public void override_property()
        {
            RuntimeTypeBuilder typeBuilder = new RuntimeTypeBuilder("OverrideProperty", typeof(BasePropertyClass));

            PropertyInfo propInfo = typeof(BasePropertyClass).GetProperty("Text");

            typeBuilder.OverrideMethod(propInfo.GetGetMethod(),
                                       null,
                                       Call("Concat", typeof(string), Call(typeBuilder.Base, propInfo.GetGetMethod()), Constant(" (overriden)"))
                                       );

            Type   newType     = typeBuilder.Create();
            object newInstance = Activator.CreateInstance(newType);

            propInfo.SetValue(newInstance, "this is a property!");
            string result = (string)propInfo.GetValue(newInstance);

            Assert.Equal("this is a property! (overriden)", result);
        }