public override void EmitLoad(ILGenerator generator) { EmitLoadToStack(generator); var mt = _methodParameter.ParameterType.RemoveByRef(); var dt = _delegateParameter.ParameterType.RemoveByRef(); if (dt.IsValueType && !mt.IsValueType) generator.EmitBox(dt); else if (!mt.IsAssignableFrom(dt)) generator.EmitUnBoxAnyOrCastClass(mt); }
public override void EmitPrepare(ILGenerator generator) { base.EmitPrepare(generator); if (!_needLocalVariable) return; generator.EmitLdarg(_delegateParameterIndex); var dt = _delegateParameter.ParameterType.RemoveByRef(); var mt = _methodParameter.ParameterType.RemoveByRef(); if (_delegateParameter.ParameterType.IsByRef) generator.EmitLdind(dt); if (dt.IsValueType && !mt.IsValueType) generator.EmitBox(dt); else if (!mt.IsAssignableFrom(dt)) generator.EmitUnBoxAnyOrCastClass(mt); generator.EmitStloc(_localVariable.LocalIndex); }