コード例 #1
0
        public bool CanBuild(ExpressionBuilder builder, BuildInfo buildInfo)
        {
            var expr = buildInfo.Expression;

            if (expr.NodeType == ExpressionType.NewArrayInit)
            {
                return(true);
            }

            if (expr.NodeType == ExpressionType.Call)
            {
                var mc = (MethodCallExpression)expr;
                if (mc.IsSameGenericMethod(_containsMethodInfos))
                {
                    return(false);
                }
            }

            if (!typeof(IEnumerable <>).IsSameOrParentOf(expr.Type))
            {
                return(false);
            }

            var collectionType = typeof(IEnumerable <>).GetGenericType(expr.Type);

            if (collectionType == null)
            {
                return(false);
            }

            if (!builder.CanBeCompiled(expr))
            {
                return(false);
            }

            switch (expr.NodeType)
            {
            case ExpressionType.MemberAccess:
            {
                var ma = (MemberExpression)expr;
                if (ma.Expression == null)
                {
                    break;
                }

                if (ma.Expression.NodeType != ExpressionType.Constant)
                {
                    return(false);
                }
                break;
            }

            case ExpressionType.Constant:
                if (((ConstantExpression)expr).Value is not IEnumerable)
                {
                    return(false);
                }
                break;

            default:
                return(false);
            }

            return(true);
        }