Skip to content

Parse exceptions with (nested) static classes #773

@poostwoud

Description

@poostwoud

1. Description

I'm trying to create an Excel-like function syntax using nested static classes. I'm experiencing difficulties with some class names and nested classes. Below is the Fiddle code:

using System;
using System.Collections.Generic;
using System.Linq.Dynamic.Core;
using System.Linq.Dynamic.Core.CustomTypeProviders;
using System.Linq.Expressions;

public class Program
{
    public static void Main()
    {
        var config = new ParsingConfig
        {
            CustomTypeProvider = new CustomTypeProvider(new[] { typeof(IST), typeof(IST.NOT) })
        };

        // Not working;
        var expression = "IS.NULL(null)";
        try
        {
            var result = DynamicExpressionParser.ParseLambda(
                config,
                false,
                new ParameterExpression[] {  },
                typeof(bool),
                expression
            );
            Console.WriteLine($"{expression} success");
        }
        catch (Exception ex)
        {
            Console.WriteLine(
                $"{expression} failed, because of {ex.GetType().FullName} with message {ex.Message}"
            );
        }

        // Working;
        expression = "IST.NULL(null)";
        try
        {
            var result = DynamicExpressionParser.ParseLambda(
                config,
                false,
                new ParameterExpression[] {  },
                typeof(bool),
                expression
            );
            Console.WriteLine($"{expression} success");
        }
        catch (Exception ex)
        {
            Console.WriteLine(
                $"{expression} failed, because of {ex.GetType().FullName} with message {ex.Message}"
            );
        }

        // Not working;
        expression = "IS.NOT.NULL(null)";
        try
        {
            var result = DynamicExpressionParser.ParseLambda(
                config,
                false,
                new ParameterExpression[] {  },
                typeof(bool),
                expression
            );
            Console.WriteLine($"{expression} success");
        }
        catch (Exception ex)
        {
            Console.WriteLine(
                $"{expression} failed, because of {ex.GetType().FullName} with message {ex.Message}"
            );
        }

        // Not working;
        expression = "IST.NOT.NULL(null)";
        try
        {
            var result = DynamicExpressionParser.ParseLambda(
                config,
                false,
                new ParameterExpression[] {  },
                typeof(bool),
                expression
            );
            Console.WriteLine($"{expression} success");
        }
        catch (Exception ex)
        {
            Console.WriteLine(
                $"{expression} failed, because of {ex.GetType().FullName} with message {ex.Message}"
            );
        }
    }

    public class CustomTypeProvider : DefaultDynamicLinqCustomTypeProvider
    {
        private readonly HashSet<Type> _types;

        public CustomTypeProvider(Type[] types)
        {
            _types = new HashSet<Type>(types);
        }

        public override HashSet<Type> GetCustomTypes()
        {
            return _types;
        }
    }

    public static class IS
    {
        public static bool NULL(object value) => value == null;

        public static class NOT
        {
            public static bool NULL(object value) => value != null;
        }
    }

    public static class IST
    {
        public static bool NULL(object value) => value == null;

        public static class NOT
        {
            public static bool NULL(object value) => value != null;
        }
    }
}

2. Exception

Fiddle output:

IS.NULL(null) failed, because of System.Linq.Dynamic.Core.Exceptions.ParseException with message '(' expected
IST.NULL(null) success
IS.NOT.NULL(null) failed, because of System.Linq.Dynamic.Core.Exceptions.ParseException with message '(' expected
IST.NOT.NULL(null) failed, because of System.Linq.Dynamic.Core.Exceptions.ParseException with message Identifier expected

3. Fiddle

https://dotnetfiddle.net/nRMI2q

Metadata

Metadata

Assignees

Labels

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions