public Expression Build(
            CopyPolicy copyPolicy,
            Type type,
            Expression source,
            Expression destination,
            MemberInfo member,
            Expression cache)
        {
            var elementType = type.GetElementType();

            if (copyPolicy == CopyPolicy.DeepCopy)
            {
                if (type.GetArrayRank() > 1)
                {
                    return(CreateDeepCopyRectangulerArrayExpression(
                               type, elementType, source, MemberAccessorGenerator.CreateGetter(destination, member), cache));
                }

                //return MemberAccessorGenerator.CreateSetter(
                //    destination,
                //    member,
                //    ClonerCache.Instance.Get(elementType, source));


                var length      = Expression.ArrayLength(source);
                var arrayAssign = MemberAccessorGenerator.CreateSetter(
                    destination,
                    member,
                    Expression.NewArrayBounds(elementType, length));

                return(CreateDeepCopyArrayExpression(
                           elementType,
                           source,
                           MemberAccessorGenerator.CreateGetter(destination, member),
                           length,
                           arrayAssign,
                           cache));
            }

            if (copyPolicy == CopyPolicy.ShallowCopy)
            {
                return(CreateShallowCopyArrayExpression(
                           type,
                           source,
                           MemberAccessorGenerator.CreateGetter(destination, member)));
            }

            throw new InvalidOperationException();
        }
Beispiel #2
0
 private static extern int criFsInstaller_Create(out IntPtr installer, CopyPolicy option);