Esempio n. 1
0
        public override async Task <object> ReadDataSegment(ReportDataSegment reportDataSegment)
        {
            return(await Task.Factory.StartNew(
                       () =>
            {
                JToken jToken = JsonConvert.DeserializeObject <JToken>($"{reportDataSegment.Value}");
                ProcessJToken(jToken);
                return jToken;
            }));

            void ProcessJToken(JToken jToken)
            {
                switch (jToken)
                {
                case JArray jArray:
                    foreach (var item in jArray)
                    {
                        ProcessJToken(item);
                    }
                    break;

                case JObject json:
                    foreach (var item in json)
                    {
                        ProcessJToken(item.Value);
                    }
                    break;

                case JValue jValue:
                    if (jValue.Value is string value && value.StartsWith('@') &&
                        _parameters.TryGetValue(value.Substring(1), out var str))
                    {
                        // search  value in dictionary
                        jValue.Value = str;
                    }
                    break;
                }
            }
        }
Esempio n. 2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="reportDataSegment"></param>
        /// <returns></returns>
        public override async Task <object> ReadDataSegment(ReportDataSegment reportDataSegment)
        {
            Type interfaceType = typeof(IReportDataRepository);

            Type reportDataRepositoryType = AppDomain.CurrentDomain.GetAssemblies()
                                            .SelectMany(x => x.GetTypes())
                                            .First(x => interfaceType.IsAssignableFrom(x) && !x.IsInterface && !x.IsAbstract);

            Type[]   types   = new Type[reportDataSegment.Params.Count];
            object[] @params = new object[reportDataSegment.Params.Count];

            for (int i = 0; i < reportDataSegment.Params.Count; i++)
            {
                ReportDataParam param = reportDataSegment.Params[i];

                dynamic paramValue;
                if (!string.IsNullOrEmpty(param.ParamValue) && param.ParamValue.StartsWith('@'))
                {
                    var boolean = _parameters.TryGetValue(
                        reportDataSegment.Params[i].ParamValue.Substring(1), out paramValue);
                    //to do something if paramValue is Null
                }
                else
                {
                    paramValue = reportDataSegment.Params[i].ParamValue;
                }

                switch (param.ParamType)
                {
                case ReportParamType.INT32:
                    @params[i] = NullableHelper.Parse <int>($"{paramValue}", int.TryParse);
                    types[i]   = typeof(int?);
                    break;

                case ReportParamType.INT64:
                    @params[i] = NullableHelper.Parse <long>($"{paramValue}", long.TryParse);
                    types[i]   = typeof(long?);
                    break;

                case ReportParamType.STRING:
                    @params[i] = paramValue;
                    types[i]   = typeof(string);
                    break;

                case ReportParamType.DATETIME:
                    @params[i] = NullableHelper.Parse <DateTime>($"{paramValue}", DateTime.TryParse);
                    types[i]   = typeof(DateTime?);
                    break;

                case ReportParamType.BOOL:
                    @params[i] = NullableHelper.Parse <bool>($"{paramValue}", bool.TryParse);
                    types[i]   = typeof(bool?);
                    break;

                default:
                    break;
                }
            }

            object reportDataRepository = Activator.CreateInstance(reportDataRepositoryType, configuration);

            string methodName = reportDataSegment.Name;

            MethodInfo method = reportDataRepositoryType.GetMethod(methodName, types);

            if (method is null)
            {
                throw new NullReferenceException($"{nameof(method)}: { methodName } not found");
            }

            object result = null;

            result = await(Task <string>) method.Invoke(reportDataRepository, @params);

            return(JsonConvert.DeserializeObject <dynamic>($"{result}"));
        }