ReadableExpressions icon indicating copy to clipboard operation
ReadableExpressions copied to clipboard

System.ArgumentException : Argument types do not match if right part is LINQ

Open EvgenyMarchuk opened this issue 1 year ago • 0 comments

Hello! It's me again. Found a new defect with the same problem. Sorry for the spam, added comment to the previose bug last week but decided to open a new defect.

.ResponseValue(x => x.Any(c => c.Currency == source.Currency.First().Code));
Unhandled exception. System.ArgumentException: Argument types do not match
   at System.Linq.Expressions.Expression.Constant(Object value, Type type)
   at AgileObjects.ReadableExpressions.Translations.MemberAccessTranslation.For(MemberExpression memberAccess, ITranslationContext context)
   at AgileObjects.ReadableExpressions.Translations.ExpressionTranslation.GetDefaultTranslation(Expression expression)
   at AgileObjects.ReadableExpressions.Translations.ExpressionTranslation.GetTranslationFor(Expression expression)
   at AgileObjects.ReadableExpressions.Translations.BinaryTranslation..ctor(BinaryExpression binary, ITranslationContext context)
   at AgileObjects.ReadableExpressions.Translations.BinaryTranslation.For(BinaryExpression binary, ITranslationContext context)
   at AgileObjects.ReadableExpressions.Translations.ExpressionTranslation.GetDefaultTranslation(Expression expression)
   at AgileObjects.ReadableExpressions.Translations.ExpressionTranslation.GetTranslationFor(Expression expression)
   at AgileObjects.ReadableExpressions.Extensions.PublicTranslationContextExtensions.GetCodeBlockTranslationFor(ITranslationContext context, Expression expression)
   at AgileObjects.ReadableExpressions.Translations.LambdaTranslation..ctor(LambdaExpression lambda, ITranslationContext context)
   at AgileObjects.ReadableExpressions.Translations.ExpressionTranslation.GetDefaultTranslation(Expression expression)
   at AgileObjects.ReadableExpressions.Translations.ExpressionTranslation.GetTranslationFor(Expression expression)
   at AgileObjects.ReadableExpressions.Translations.ParameterSetTranslation.GetParameterTranslation(Expression parameter, IParameter info, ITranslationContext context)
   at AgileObjects.ReadableExpressions.Translations.ParameterSetTranslation.<>c__DisplayClass7_0.<.ctor>b__0(Expression p, Int32 index)
   at AgileObjects.ReadableExpressions.Extensions.InternalEnumerableExtensions.Project[TItem,TResult](IEnumerable`1 items, Func`3 projector)+MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at AgileObjects.ReadableExpressions.Translations.ParameterSetTranslation..ctor(IMethodBase method, IEnumerable`1 parameters, Boolean showParameterTypeNames, Int32 count, ITranslationContext context)
   at AgileObjects.ReadableExpressions.Translations.ParameterSetTranslation.For[TParameterExpression](IMethodBase method, ICollection`1 parameters, Boolean showParameterTypeNames, ITranslationContext context)
   at AgileObjects.ReadableExpressions.Translations.ParameterSetTranslation.For[TParameterExpression](IMethod method, ICollection`1 parameters, ITranslationContext context)
   at AgileObjects.ReadableExpressions.Translations.MethodCallTranslation.For(MethodCallExpression methodCall, ITranslationContext context)
   at AgileObjects.ReadableExpressions.Translations.ExpressionTranslation.GetDefaultTranslation(Expression expression)
   at AgileObjects.ReadableExpressions.Translations.ExpressionTranslation.GetTranslationFor(Expression expression)
   at AgileObjects.ReadableExpressions.Extensions.PublicTranslationContextExtensions.GetCodeBlockTranslationFor(ITranslationContext context, Expression expression)
   at AgileObjects.ReadableExpressions.Translations.LambdaTranslation..ctor(LambdaExpression lambda, ITranslationContext context)
   at AgileObjects.ReadableExpressions.Translations.ExpressionTranslation.GetDefaultTranslation(Expression expression)
   at AgileObjects.ReadableExpressions.Translations.ExpressionTranslation.GetTranslationFor(Expression expression)
   at AgileObjects.ReadableExpressions.Translations.ExpressionTranslation.GetTranslation()
   at AgileObjects.ReadableExpressions.ExpressionExtensions.ToReadableString(Expression expression, Func`2 configuration)
   at ConsoleApp2.LambdaExpressionExtension.GetMember(LambdaExpression memberSelector) in C:\Users\EV\source\repos\ConsoleApp2\Program.cs:line 97
   at ConsoleApp2.ResponseValidator`1.ResponseValue[TProperty](Expression`1 property) in C:\Users\EV\source\repos\ConsoleApp2\Program.cs:line 60
   at ConsoleApp2.Program.Main(String[] args) in C:\Users\EV\source\repos\ConsoleApp2\Program.cs:line 40
namespace ConsoleApp2
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var source = new BalanceSource
            {
                Currency = new List<ExcludedCurrency>
                {
                    new()
                    {
                        Code = CurrencyType.USD
                    }
                }
            };

            var balances = new List<BalanceModel>
                {
                    new()
                    {
                        Amount = 1,
                        Currency = CurrencyType.EUR
                    },
                    new()
                    {
                        Amount = 5,
                        Currency = CurrencyType.USD
                    },
                    new()
                    {
                        Amount = 10,
                        Currency = CurrencyType.GBP
                    }
            };

            new ResponseValidator<List<BalanceModel>>(balances)
                .ResponseValue(x => x.Any(c => c.Currency == source.Currency.First().Code));
        }
    }

    public class ResponseValidator<T>
    {
        private readonly T _response;

        public ResponseValidator(T response)
        {
            _response = response;
        }

        public ResponseValidator<T> ResponseValue<TProperty>(Expression<Func<T, TProperty>> property)
        {
            var member = property.GetMember();
            var compiledProperty = property.Compile()(_response);

            Console.WriteLine($"{member}: {compiledProperty}");
            return this;
        }
    }

    public class BalanceModel
    {
        public double Amount { get; set; }
        public CurrencyType Currency { get; set; }
    }

    public class BalanceSource
    {
        public List<ExcludedCurrency> Currency { get; set; }
    }

    public class ExcludedCurrency
    {
        public CurrencyType Code { get; set; }
    }

    public enum CurrencyType
    {
        EUR,
        GBP,
        USD
    }

    public static class LambdaExpressionExtension
    {
        public static string GetMember(this LambdaExpression memberSelector)
        {
            var i = new Func<ITranslationSettings, ITranslationSettings>(s => s.ShowCapturedValues);

            return memberSelector.ToReadableString(i);
        }
    }
}

EvgenyMarchuk avatar Oct 20 '23 08:10 EvgenyMarchuk