Пример #1
0
        public static MethodBuilder OverrideMethod(this TypeBuilder source, MethodInfo parentMethod, Func<ILGenerator, ILGenerator> body, IDictionary<MethodInfo, MethodBuilder> map)
        {
            var derived = source.DefineMethod(
                // that's an awesome idea but it hurts reflector and debuggability
                //                String.Format("{0}_{1}", parentMethod.Name, parentMethod.DeclaringType.ToShortString()),
                parentMethod.Name,
                MethodAttributes.Final | MethodAttributes.Public | MethodAttributes.Virtual,
                parentMethod.ReturnType,
                parentMethod.Args());

            if (body != null) body(derived.il());

            source.DefineMethodOverride(derived, parentMethod);
            if (map != null) map[parentMethod] = derived;
            return derived;
        }
Пример #2
0
        public static MethodBuilder DefineOverride(this TypeBuilder t, MethodInfo @base)
        {
            MethodAttributes fixt = 0;
            var allAttrs = Enum.GetValues(typeof(MethodAttributes)).Cast<MethodAttributes>();
            var validAttrs = allAttrs
                .Where(a => a != MethodAttributes.Abstract)
                .Where(a => a != MethodAttributes.NewSlot);
            validAttrs.ForEach(a => fixt |= (a & @base.Attributes));

            var @override = t.DefineMethod(
                @base.Name,
                fixt,
                @base.ReturnType,
                @base.Args());

            return @override;
        }