Exemple #1
0
        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);
        }
Exemple #2
0
 public void Emit(OpCode opCode, IILField ilField)
 {
     _ilGenerator.Emit(opCode, ((IILFieldPrivate)ilField).TrueField);
 }
Exemple #3
0
 public static IILGen Stsfld(this IILGen il, IILField fieldInfo)
 {
     il.Emit(OpCodes.Stsfld, fieldInfo);
     return(il);
 }
Exemple #4
0
 public static IILGen Ldflda(this IILGen il, IILField fieldInfo)
 {
     il.Emit(OpCodes.Ldflda, fieldInfo);
     return(il);
 }
Exemple #5
0
 public EmitILField(OpCode opCode, IILField ilField)
 {
     _opCode  = opCode;
     _ilField = ilField;
 }
Exemple #6
0
 public void Emit(OpCode opCode, IILField ilField)
 {
     _instructions.Add(new EmitILField(opCode, ilField));
 }
Exemple #7
0
 public void Emit(OpCode opCode, IILField ilField)
 {
     _ilGenerator.Emit(opCode, ((IILFieldPrivate)ilField).TrueField);
 }
Exemple #8
0
 public void Emit(OpCode opCode, IILField ilField)
 {
     _sourceCodeWriter.MarkAndWriteLine(_ilGenerator,
                                        $"{opCode} field {ilField.FieldType.ToSimpleName()} {ilField.Name}");
     _ilGenerator.Emit(opCode, ((IILFieldPrivate)ilField).TrueField);
 }