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