Пример #1
0
        private Cut WriteUnwrapperBody(Cut il, ParameterDefinition argsParam, MethodDefinition original)
        {
            var refList = new List <Tuple <int, VariableDefinition> >();

            var originalRef = CreateRef(original, il.Method);

            il = il.ThisOrStatic().Call(originalRef, c =>
            {
                for (int i = 0; i < original.Parameters.Count; i++)
                {
                    var p = original.Parameters[i];

                    if (p.ParameterType.IsByReference)
                    {
                        var elementType = ((ByReferenceType)p.ParameterType).ElementType;

                        var tempVar = new VariableDefinition(elementType);
                        refList.Add(new Tuple <int, VariableDefinition>(i, tempVar));
                        c.Method.Body.Variables.Add(tempVar);

                        c = c
                            .Store(tempVar, v => v
                                   .Load(argsParam)
                                   .GetByIndex(StandardTypes.Object, i)
                                   .Cast(StandardTypes.Object, elementType))
                            .LoadRef(tempVar);
                    }
                    else
                    {
                        c = c
                            .Load(argsParam)
                            .GetByIndex(StandardTypes.Object, i)
                            .Cast(StandardTypes.Object, p.ParameterType);
                    }
                }

                return(c);
            });

            foreach (var refPar in refList)
            {
                il = il.Load(argsParam).SetByIndex(StandardTypes.Object, refPar.Item1, val => val.Load(refPar.Item2).Cast(refPar.Item2.VariableType, StandardTypes.Object));
            }

            if (original.ReturnType.Match(StandardTypes.Void))
            {
                il = il.Value(null);
            }
            else
            {
                il = il.Cast(originalRef.ReturnType, il.Method.ReturnType);
            }

            return(il.Return());
        }
Пример #2
0
        public static Cut CreateAspectInstance(this Cut cut, AspectDefinition aspect)
        {
            cut = cut.Call(aspect.GetFactoryMethod(), arg => aspect.Factory != null ? arg.TypeOf(aspect.Host) : arg);

            if (aspect.Factory != null)
            {
                cut = cut.Cast(StandardTypes.Object, aspect.Host);
            }

            return(cut);
        }