static IILMethod GenerateAddRemoveEvent(IILDynamicType typeBuilder, IILField fieldBuilder, bool add) { Type typePropertyChangedEventHandler = typeof(PropertyChangedEventHandler); EventInfo eventPropertyChanged = typeof(INotifyPropertyChanged).GetEvent("PropertyChanged"); var methodBuilder = typeBuilder.DefineMethod((add ? "add" : "remove") + "_PropertyChanged", typeof(void), new[] { typePropertyChangedEventHandler }, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.SpecialName | MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.Final); var ilGenerator = methodBuilder.Generator; ilGenerator.DeclareLocal(typePropertyChangedEventHandler); ilGenerator.DeclareLocal(typePropertyChangedEventHandler); ilGenerator.DeclareLocal(typePropertyChangedEventHandler); var label = ilGenerator.DefineLabel(); ilGenerator .Ldarg(0) .Ldfld(fieldBuilder) .Stloc(0) .Mark(label) .Ldloc(0) .Stloc(1) .Ldloc(1) .Ldarg(1) .Call(add ? GetMethodInfo(() => Delegate.Combine(null, null)) : GetMethodInfo(() => Delegate.Remove(null, null))) .Castclass(typePropertyChangedEventHandler) .Stloc(2) .Ldarg(0) .Ldflda(fieldBuilder) .Ldloc(2) .Ldloc(1); PropertyChangedEventHandler stub = null; ilGenerator .Call(() => Interlocked.CompareExchange(ref stub, null, null)) .Stloc(0) .Ldloc(0) .Ldloc(1) .BneUnS(label) .Ret(); typeBuilder.DefineMethodOverride(methodBuilder, add ? eventPropertyChanged.GetAddMethod() : eventPropertyChanged.GetRemoveMethod()); return(methodBuilder); }
public void Emit(OpCode opCode, IILField ilField) { _ilGenerator.Emit(opCode, ((IILFieldPrivate)ilField).TrueField); }
public static IILGen Stsfld(this IILGen il, IILField fieldInfo) { il.Emit(OpCodes.Stsfld, fieldInfo); return(il); }
public static IILGen Ldflda(this IILGen il, IILField fieldInfo) { il.Emit(OpCodes.Ldflda, fieldInfo); return(il); }
public EmitILField(OpCode opCode, IILField ilField) { _opCode = opCode; _ilField = ilField; }
public void Emit(OpCode opCode, IILField ilField) { _instructions.Add(new EmitILField(opCode, ilField)); }
public void Emit(OpCode opCode, IILField ilField) { _sourceCodeWriter.MarkAndWriteLine(_ilGenerator, $"{opCode} field {ilField.FieldType.ToSimpleName()} {ilField.Name}"); _ilGenerator.Emit(opCode, ((IILFieldPrivate)ilField).TrueField); }