using System; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; using Microsoft.SharePoint.Client; // ReSharper disable once CheckNamespace namespace ProxyInterfaceConsumerForPnP.Interfaces; [SuppressMessage("ReSharper", "InconsistentNaming")] public partial class ClientContextProxy { public Task ExecuteQueryRetryAsync( Interfaces.IClientRuntimeContext clientContext, int retryCount = 10, string? userAgent = null ) { ClientRuntimeContext clientObject_ = Mapster.TypeAdapter.Adapt( clientContext ); return clientObject_.ExecuteQueryRetryAsync(retryCount, userAgent); } public void LoadOriginal(T clientObject, params Expression>[] retrievals) where T : ClientObject { T clientObject_ = clientObject; Expression>[] retrievals_ = retrievals; _Instance.Load(clientObject_, retrievals_); } public void Load( Interfaces.IClientObject clientObject, params Expression>[] retrievals ) where TSource : Interfaces.IClientObject where TTarget : ClientObject { TTarget clientObject_ = Mapster.TypeAdapter.Adapt(clientObject); Expression>[] retrievals_ = retrievals .Select(MapExpression) .ToArray(); _Instance.Load(clientObject_, retrievals_); } private static Expression> MapExpression( Expression> expression ) where TSource : Interfaces.IClientObject where TTarget : ClientObject { var parameterExpression = Expression.Parameter(typeof(TTarget)); Expression memberAccessExpression; switch (expression.Body) { case MemberExpression memberExpression: memberAccessExpression = Expression.PropertyOrField( parameterExpression, memberExpression.Member.Name ); break; case UnaryExpression unaryExpression: var expressionOperand = (MemberExpression)unaryExpression.Operand; memberAccessExpression = Expression.PropertyOrField( parameterExpression, expressionOperand.Member.Name ); memberAccessExpression = Expression.Convert(memberAccessExpression, typeof(object)); break; default: throw new NotSupportedException(); } return Expression.Lambda>( memberAccessExpression, parameterExpression ); } }