internal void SetParameterMethod(string pm, IExpr[] args)
        {
            if (!this.p.MultiValue)
                throw new ArgumentException(string.Format("{0} must be a MultiValue parameter to accept methods", this.p.Name.Nm));

            if (pm == null)
            {
                _type = ReportParameterMethodEnum.Index;
            }
            else switch (pm)
            {
                case "Contains": _type = ReportParameterMethodEnum.Contains; break;
                case "BinarySearch": _type = ReportParameterMethodEnum.BinarySearch; break;
                case "Count": 
                    _type = ReportParameterMethodEnum.Count; 
                    if (args != null)
                        throw new ArgumentException("Count does not have any arguments.");
                    break;
                case "IndexOf": _type = ReportParameterMethodEnum.IndexOf; break;
                case "LastIndexOf": _type = ReportParameterMethodEnum.LastIndexOf; break;
                case "Value": _type = ReportParameterMethodEnum.Value; break;
                default:
                    throw new ArgumentException(string.Format("{0} is an unknown array method.", pm));
            }

            if (_type != ReportParameterMethodEnum.Count)
            {
                if (args == null || args.Length != 1)
                    throw new ArgumentException(string.Format("{0} must have exactly one argument.", pm));

                _arg = args[0];
            }

            return;
        }
        internal void SetParameterMethod(string pm, IExpr[] args)
        {
            if (!this.p.MultiValue)
            {
                throw new ArgumentException(string.Format("{0} must be a MultiValue parameter to accept methods", this.p.Name.Nm));
            }

            if (pm == null)
            {
                _type = ReportParameterMethodEnum.Index;
            }
            else
            {
                switch (pm)
                {
                case "Contains": _type = ReportParameterMethodEnum.Contains; break;

                case "BinarySearch": _type = ReportParameterMethodEnum.BinarySearch; break;

                case "Count":
                    _type = ReportParameterMethodEnum.Count;
                    if (args != null)
                    {
                        throw new ArgumentException("Count does not have any arguments.");
                    }
                    break;

                case "IndexOf": _type = ReportParameterMethodEnum.IndexOf; break;

                case "LastIndexOf": _type = ReportParameterMethodEnum.LastIndexOf; break;

                case "Value": _type = ReportParameterMethodEnum.Value; break;

                default:
                    throw new ArgumentException(string.Format("{0} is an unknown array method.", pm));
                }
            }

            if (_type != ReportParameterMethodEnum.Count)
            {
                if (args == null || args.Length != 1)
                {
                    throw new ArgumentException(string.Format("{0} must have exactly one argument.", pm));
                }

                _arg = args[0];
            }

            return;
        }
        IExpr _arg;                         // when MultiValue parameter; methods may need arguments

        /// <summary>
        /// obtain value of ReportParameter
        /// </summary>
        public FunctionReportParameter(ReportParameter parm)
        {
            p     = parm;
            _type = ReportParameterMethodEnum.Value;
            _arg  = null;
        }
 /// <summary>
 /// obtain value of ReportParameter
 /// </summary>
 public FunctionReportParameter(ReportParameter parm)
 {
     p=parm;
     _type = ReportParameterMethodEnum.Value;
     _arg = null;
 }