//----------------------------------------------------------------------------------------------------------------------------------------------------- public DelegateOperand(IOperand target, MethodInfo method, Type delegateTypeOverride = null) { m_Target = target; m_Method = method; var effectiveDelegateType = delegateTypeOverride ?? base.OperandType; m_Constructor = DelegateShortcuts.GetDelegateConstructor(effectiveDelegateType); }
//----------------------------------------------------------------------------------------------------------------------------------------------------- protected override void OnEmitLoad(ILGenerator il) { if (m_CallSite.IsDefined()) { m_CallSite.EmitLoad(il); } else { var target = GetTargetOperand(); var delegateConstructor = DelegateShortcuts.GetDelegateConstructor(OperandType); target.EmitTarget(il); target.EmitLoad(il); il.Emit(OpCodes.Ldftn, (MethodBuilder)m_Method.MethodFactory.Builder); il.Emit(OpCodes.Newobj, delegateConstructor); } }
//----------------------------------------------------------------------------------------------------------------------------------------------------- private bool TryEmitStaticDelegateValue(ILGenerator il, Delegate @delegate) { if (@delegate != null) { if ([email protected]) { throw new NotSupportedException("Constants of delegate types can only point to static methods."); } il.Emit(OpCodes.Ldnull); il.Emit(OpCodes.Ldftn, @delegate.Method); il.Emit(OpCodes.Newobj, DelegateShortcuts.GetDelegateConstructor(@delegate.GetType())); return(true); } else { return(false); } }