コード例 #1
0
        public void OD_OdataArray_Creation_string()
        {
            var strings = new[] { "item1", "item2", "item3" };
            var array   = new ODataArray <string>((IEnumerable <string>)strings);

            AssertSequenceEqual(strings, array);
        }
コード例 #2
0
        public void OD_OdataArray_Creation_int()
        {
            var numbers = new[] { 1, 2, 42 };
            var array   = new ODataArray <int>(numbers);

            AssertSequenceEqual(numbers, array);
        }
コード例 #3
0
        public void OD_OdataArray_Creation_long()
        {
            var numbers = new[] { 1L, 2L, 42L };
            var array   = new ODataArray <long>(numbers);

            AssertSequenceEqual(numbers, array);
        }
コード例 #4
0
ファイル: ContentOperations.cs プロジェクト: onpoc/sensenet
        public static bool HasPermission(Content content, ODataArray <string> permissions, string user = null)
        {
            IUser userObject = null;

            if (!string.IsNullOrEmpty(user))
            {
                userObject = Node.Load <User>(user);
                if (userObject == null)
                {
                    throw new ContentNotFoundException("Identity not found: " + user);
                }
            }

            if (permissions == null)
            {
                throw new ArgumentNullException(nameof(permissions));
            }

            var permissionNames = permissions;
            var permissionArray = permissionNames.Select(GetPermissionTypeByName).ToArray();

            return(user == null
                ? content.Security.HasPermission(permissionArray)
                : content.Security.HasPermission(userObject, permissionArray));
        }
コード例 #5
0
        public void OD_OdataArray_Creation_bool_CSrv()
        {
            var predicates = new [] { true, false, true };
            var array      = new ODataArray <bool>(predicates);

            AssertSequenceEqual(predicates, array);
        }
コード例 #6
0
        public void OD_OdataArray_Creation_float()
        {
            var numbers = new[] { 1.1f, 2.1f, 42.1f };
            var array   = new ODataArray <float>(numbers);

            AssertSequenceEqual(numbers, array);
        }
コード例 #7
0
        public void OD_OdataArray_Parse_long()
        {
            var numbers = new[] { 1L, 2L, 42L };
            var array   = new ODataArray <long>("1, 2, 42");

            AssertSequenceEqual(numbers, array);
        }
コード例 #8
0
        public void OD_OdataArray_Parse_byte()
        {
            var numbers = new byte[] { 1, 2, 42 };
            var array   = new ODataArray <byte>("1, 2, 42");

            AssertSequenceEqual(numbers, array);
        }
コード例 #9
0
        public void OD_OdataArray_Parse_bool()
        {
            var predicates = new[] { true, false, true };
            var array      = new ODataArray <bool>("true, false, true");

            AssertSequenceEqual(predicates, array);
        }
コード例 #10
0
        public void OD_OdataArray_Parse_int()
        {
            var numbers = new[] { 1, 2, 42 };
            var array   = new ODataArray <int>("1, 2, 42");

            AssertSequenceEqual(numbers, array);
        }
コード例 #11
0
        public void OD_OdataArray_Creation_double()
        {
            var numbers = new[] { 1.1d, 2.1d, 42.1d };
            var array   = new ODataArray <double>(numbers);

            AssertSequenceEqual(numbers, array);
        }
コード例 #12
0
        public void OD_OdataArray_Parse_string()
        {
            var strings = new[] { "item1", "item2", "item3" };
            var array   = new ODataArray <string>("item1, item2, item3");

            AssertSequenceEqual(strings, array);
        }
コード例 #13
0
        public void OD_OdataArray_Creation_decimal()
        {
            var numbers = new[] { 1.1m, 2.1m, 42.1m };
            var array   = new ODataArray <decimal>(numbers);

            AssertSequenceEqual(numbers, array);
        }
コード例 #14
0
        public void OD_OdataArray_Creation_byte()
        {
            var numbers = new byte[] { 1, 2, 42 };
            var array   = new ODataArray <byte>(numbers);

            AssertSequenceEqual(numbers, array);
        }
コード例 #15
0
        public void OD_OdataArray_Creation_TestItem()
        {
            var numbers = new[] { 1, 2, 42 };
            var items   = numbers.Select(x => new TestItem(x)).ToArray();
            var array   = new ODataArray <TestItem>(items);

            AssertSequenceEqual(numbers, array.Select(x => x.Value));
        }
コード例 #16
0
        public void OD_OdataArray_Parse_TestItem_Error()
        {
            var numbers = new[] { 1, 2, 42 };
            // Incompetent type. Needs TestItemArray
            var array = new ODataArray <TestItem>("#1.1, #2.1, #42.1");

            AssertSequenceEqual(numbers, array.Select(x => x.Value));
        }
コード例 #17
0
 public void OD_OdataArray_Parse_float_HU()
 {
     using (CultureHack("hu-HU"))
     {
         var numbers = new[] { 1.1f, 2.1f, 42.1f };
         var array   = new ODataArray <float>("1.1, 2.1, 42.1");
         AssertSequenceEqual(numbers, array);
     }
 }
コード例 #18
0
 public void OD_OdataArray_Parse_decimal_US()
 {
     using (CultureHack("en-US"))
     {
         var numbers = new[] { 1.1m, 2.1m, 42.1m };
         var array   = new ODataArray <decimal>("1.1, 2.1, 42.1");
         AssertSequenceEqual(numbers, array);
     }
 }
コード例 #19
0
 public void OD_OdataArray_Parse_double_HU_Comma()
 {
     using (CultureHack("hu"))
     {
         var numbers = new[] { 1.1d, 2.1d, 42.1d };
         var array   = new ODataArray <double>("; 1,1; 2,1; 42,1");
         AssertSequenceEqual(numbers, array);
     }
 }
コード例 #20
0
 public void OD_OdataArray_Parse_double_HU()
 {
     using (CultureHack("hu-HU"))
     {
         var numbers = new[] { 1.1d, 2.1d, 42.1d };
         var array   = new ODataArray <double>("1.1, 2.1, 42.1");
         AssertSequenceEqual(numbers, array);
     }
 }
コード例 #21
0
        /// <summary>
        /// Read the <see cref="HttpContent"/> as OData resource set.
        /// </summary>
        /// <param name="content">The http content.</param>
        /// <returns>The OData array.</returns>
        public static async Task <ODataArray> ReadAsODataArrayAsync(this HttpContent content)
        {
            if (content == null)
            {
                throw new ArgumentNullException(nameof(content));
            }

            Stream stream = await content.ReadAsStreamAsync();

            using (JsonDocument doc = await JsonDocument.ParseAsync(stream))
            {
                JsonElement root = doc.RootElement;

                // OData array is an object as:
                // {
                //     "@odata.context":...
                //     "value" [ ... ]
                // }
                if (root.ValueKind != JsonValueKind.Object)
                {
                    return(null);
                }

                if (!root.TryGetProperty("value", out JsonElement value) &&
                    value.ValueKind != JsonValueKind.Array)
                {
                    return(null);
                }

                ODataArray odataArray = new ODataArray();

                // value array
                foreach (var item in value.EnumerateArray())
                {
                    IODataValue itemValue = item.ParseAsODataValue();
                    odataArray.Add(itemValue);
                }

                // context uri
                odataArray.ContextUri = ReadStringPropertyValue(root, "@odata.context", "@context");

                // next link
                odataArray.NextLink = ReadStringPropertyValue(root, "@odata.nextlink", "@nextlink");

                // odata.count
                odataArray.TotalCount = ReadIntPropertyValue(root, "@odata.count", "@count");

                return(odataArray);
            }
        }
コード例 #22
0
        /// <summary>
        /// Read <see cref="JsonElement"/> as OData value.
        /// </summary>
        /// <param name="node">The JSON element.</param>
        /// <returns>The OData value.</returns>
        public static IODataValue ParseAsODataValue(this JsonElement node)
        {
            switch (node.ValueKind)
            {
            case JsonValueKind.Object:     // A JSON object.
                ODataObject odataObject = new ODataObject();
                foreach (JsonProperty property in node.EnumerateObject())
                {
                    odataObject[property.Name] = ParseAsODataValue(property.Value);
                }

                return(odataObject);

            case JsonValueKind.Array:     // A JSON array.
                ODataArray odataArray = new ODataArray();
                foreach (JsonElement element in node.EnumerateArray())
                {
                    odataArray.Add(ParseAsODataValue(element));
                }

                return(odataArray);

            case JsonValueKind.String:     // A JSON string.
                return(new ODataString(node.GetString()));

            case JsonValueKind.Number:     // A JSON number.
                return(ReadNumber(node));

            case JsonValueKind.True:     // A JSON true.
                return(ODataBoolean.True);

            case JsonValueKind.False:     // A JSON false.
                return(ODataBoolean.False);

            case JsonValueKind.Null:     // A JSON null.
                return(ODataNull.Null);

            case JsonValueKind.Undefined:
            default:
                throw new ODataException($"Found an Undefined JSON element '{node.GetRawText()}'!");
            }
        }
コード例 #23
0
 [ODataFunction] public static IEnumerable <int> Optional_ODataArray_Int(Content content, ODataArray <int> a = null) => a;
コード例 #24
0
 [ODataFunction] public static IEnumerable <bool> Optional_ODataArray_Bool(Content content, ODataArray <bool> a = null) => a;
コード例 #25
0
ファイル: OperationCenter.cs プロジェクト: pianomanx/sensenet
        private static bool TryParseParameter(Type expectedType, ODataParameterValue parameter, bool strict, out object parsed)
        {
            if (expectedType == GetTypeAndValue(expectedType, parameter, out parsed))
            {
                return(true);
            }

            Type nullableBaseType;

            if ((nullableBaseType = Nullable.GetUnderlyingType(expectedType)) != null)
            {
                expectedType = nullableBaseType;
            }

            if (!strict)
            {
                if (parameter.Type == JTokenType.String)
                {
                    var stringValue = parameter.Value <string>();
                    #region int, long, byte, bool, decimal, float, double
                    if (expectedType == typeof(int))
                    {
                        if (int.TryParse(stringValue, out var v))
                        {
                            parsed = v;
                            return(true);
                        }
                    }
                    else if (expectedType == typeof(long))
                    {
                        if (long.TryParse(stringValue, out var v))
                        {
                            parsed = v;
                            return(true);
                        }
                    }
                    else if (expectedType == typeof(byte))
                    {
                        if (byte.TryParse(stringValue, out var v))
                        {
                            parsed = v;
                            return(true);
                        }
                    }
                    else if (expectedType == typeof(bool))
                    {
                        if (bool.TryParse(stringValue, out var v))
                        {
                            parsed = v;
                            return(true);
                        }
                    }
                    else if (expectedType == typeof(decimal))
                    {
                        if (decimal.TryParse(stringValue, out var v))
                        {
                            parsed = v;
                            return(true);
                        }
                        if (decimal.TryParse(stringValue, NumberStyles.Any, CultureInfo.InvariantCulture, out v))
                        {
                            parsed = v;
                            return(true);
                        }
                    }
                    else if (expectedType == typeof(float))
                    {
                        if (float.TryParse(stringValue, out var v))
                        {
                            parsed = v;
                            return(true);
                        }
                        if (float.TryParse(stringValue, NumberStyles.Any, CultureInfo.InvariantCulture, out v))
                        {
                            parsed = v;
                            return(true);
                        }
                    }
                    else if (expectedType == typeof(double))
                    {
                        if (double.TryParse(stringValue, out var v))
                        {
                            parsed = v;
                            return(true);
                        }
                        if (double.TryParse(stringValue, NumberStyles.Any, CultureInfo.InvariantCulture, out v))
                        {
                            parsed = v;
                            return(true);
                        }
                    }
                    else if (expectedType == typeof(DateTime))
                    {
                        if (DateTime.TryParse(stringValue, CultureInfo.CurrentCulture, DateTimeStyles.AssumeUniversal, out var v) ||
                            DateTime.TryParse(stringValue, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out v))
                        {
                            //var date = new DateTime(v.Year, v.Month, v.Day, v.Hour, v.Minute, v.Second, v.Millisecond,
                            //    DateTimeKind.Utc);
                            parsed = v.ToUniversalTime();
                            return(true);
                        }
                    }

                    #endregion
                    #region enum
                    else if (expectedType.IsEnum)
                    {
                        if (int.TryParse(stringValue, out var intValue))
                        {
                            parsed = intValue;
                            return(true);
                        }
                        try
                        {
                            parsed = Enum.Parse(expectedType, stringValue, true);
                            return(true);
                        }
                        catch
                        {
                            // do nothing
                        }
                        return(false);
                    }
                    #endregion
                    #region string[]
                    else if (expectedType == typeof(ODataArray <string>))
                    {
                        try
                        {
                            parsed = new ODataArray <string>(stringValue);
                            return(true);
                        }
                        catch { /* ignored */ }
                    }
                    else if (expectedType == typeof(List <string>))
                    {
                        parsed = new List <string> {
                            stringValue
                        };
                        return(true);
                    }
                    else if (expectedType == typeof(string[]) || expectedType == typeof(IEnumerable <string>))
                    {
                        parsed = new[] { stringValue };
                        return(true);
                    }
                    #endregion
                    #region int[]
                    else if (expectedType == typeof(ODataArray <int>))
                    {
                        try
                        {
                            parsed = new ODataArray <int>(stringValue);
                            return(true);
                        }
                        catch { /* ignored */ }
                    }
                    else if (typeof(IEnumerable <int>).IsAssignableFrom(expectedType))
                    {
                        if (int.TryParse(stringValue, out var v))
                        {
                            if (expectedType == typeof(List <int>))
                            {
                                parsed = new List <int> {
                                    v
                                }
                            }
                            ;
                            else
                            {
                                parsed = new[] { v }
                            };
                            return(true);
                        }
                    }
                    #endregion
                    #region long[]
                    else if (expectedType == typeof(ODataArray <long>))
                    {
                        try
                        {
                            parsed = new ODataArray <long>(stringValue);
                            return(true);
                        }
                        catch { /* ignored */ }
                    }
                    else if (typeof(IEnumerable <long>).IsAssignableFrom(expectedType))
                    {
                        if (long.TryParse(stringValue, out var v))
                        {
                            if (expectedType == typeof(List <long>))
                            {
                                parsed = new List <long> {
                                    v
                                }
                            }
                            ;
                            else
                            {
                                parsed = new[] { v }
                            };
                            return(true);
                        }
                    }
                    #endregion
                    #region byte[]
                    else if (expectedType == typeof(ODataArray <byte>))
                    {
                        try
                        {
                            parsed = new ODataArray <byte>(stringValue);
                            return(true);
                        }
                        catch { /* ignored */ }
                    }
                    else if (typeof(IEnumerable <byte>).IsAssignableFrom(expectedType))
                    {
                        if (byte.TryParse(stringValue, out var v))
                        {
                            if (expectedType == typeof(List <byte>))
                            {
                                parsed = new List <byte> {
                                    v
                                }
                            }
                            ;
                            else
                            {
                                parsed = new[] { v }
                            };
                            return(true);
                        }
                    }
                    #endregion
                    #region bool[]
                    else if (expectedType == typeof(ODataArray <bool>))
                    {
                        try
                        {
                            parsed = new ODataArray <bool>(stringValue);
                            return(true);
                        }
                        catch { /* ignored */ }
                    }
                    else if (typeof(IEnumerable <bool>).IsAssignableFrom(expectedType))
                    {
                        if (bool.TryParse(stringValue, out var v))
                        {
                            if (expectedType == typeof(List <bool>))
                            {
                                parsed = new List <bool> {
                                    v
                                }
                            }
                            ;
                            else
                            {
                                parsed = new[] { v }
                            };
                            return(true);
                        }
                    }
                    #endregion
                    #region decimal[]
                    else if (expectedType == typeof(ODataArray <decimal>))
                    {
                        try
                        {
                            parsed = new ODataArray <decimal>(stringValue);
                            return(true);
                        }
                        catch { /* ignored */ }
                    }
                    else if (typeof(IEnumerable <decimal>).IsAssignableFrom(expectedType))
                    {
                        if (decimal.TryParse(stringValue, out var v) ||
                            decimal.TryParse(stringValue, NumberStyles.Any, CultureInfo.InvariantCulture, out v))
                        {
                            if (expectedType == typeof(List <decimal>))
                            {
                                parsed = new List <decimal> {
                                    v
                                }
                            }
                            ;
                            else
                            {
                                parsed = new[] { v }
                            };
                            return(true);
                        }
                    }
                    #endregion
                    #region float[]
                    else if (expectedType == typeof(ODataArray <float>))
                    {
                        try
                        {
                            parsed = new ODataArray <float>(stringValue);
                            return(true);
                        }
                        catch { /* ignored */ }
                    }
                    else if (typeof(IEnumerable <float>).IsAssignableFrom(expectedType))
                    {
                        if (float.TryParse(stringValue, out var v) ||
                            float.TryParse(stringValue, NumberStyles.Any, CultureInfo.InvariantCulture, out v))
                        {
                            if (expectedType == typeof(List <float>))
                            {
                                parsed = new List <float> {
                                    v
                                }
                            }
                            ;
                            else
                            {
                                parsed = new[] { v }
                            };
                            return(true);
                        }
                    }
                    #endregion
                    #region double[]
                    else if (expectedType == typeof(ODataArray <double>))
                    {
                        try
                        {
                            parsed = new ODataArray <double>(stringValue);
                            return(true);
                        }
                        catch { /* ignored */ }
                    }
                    else if (typeof(IEnumerable <double>).IsAssignableFrom(expectedType))
                    {
                        if (double.TryParse(stringValue, out var v) ||
                            double.TryParse(stringValue, NumberStyles.Any, CultureInfo.InvariantCulture, out v))
                        {
                            if (expectedType == typeof(List <double>))
                            {
                                parsed = new List <double> {
                                    v
                                }
                            }
                            ;
                            else
                            {
                                parsed = new[] { v }
                            };
                            return(true);
                        }
                    }
                    #endregion

                    else if (typeof(ODataArray).IsAssignableFrom(expectedType))
                    {
                        try
                        {
                            parsed = ODataTools.CreateODataArray(expectedType, stringValue);
                            return(true);
                        }
                        catch { /* ignored */ }
                    }

                    //TODO: try parse further opportunities from string to "expectedType"
                }
                else if (parameter.Type == JTokenType.Integer)
                {
                    var intValue = parameter.Value <int>();
                    #region enum
                    if (expectedType.IsEnum)
                    {
                        parsed = intValue;
                        return(true);
                    }
                    #endregion
                }
            }

            parsed = null;
            return(false);
        }
コード例 #26
0
 [ODataFunction] public static IEnumerable <float> Optional_ODataArray_Float(Content content, ODataArray <float> a = null) => a;
コード例 #27
0
 [ODataFunction] public static IEnumerable <double> Optional_ODataArray_Double(Content content, ODataArray <double> a = null) => a;
コード例 #28
0
 [ODataFunction] public static IEnumerable <decimal> Optional_ODataArray_Decimal(Content content, ODataArray <decimal> a = null) => a;
コード例 #29
0
ファイル: OperationCenter.cs プロジェクト: onpoc/sensenet
        private static bool TryParseParameter(Type expectedType, ODataParameterValue parameter, bool strict, out object parsed)
        {
            if (expectedType == GetTypeAndValue(expectedType, parameter, out parsed))
            {
                return(true);
            }

            Type nullableBaseType;

            if ((nullableBaseType = Nullable.GetUnderlyingType(expectedType)) != null)
            {
                expectedType = nullableBaseType;
            }

            if (!strict)
            {
                if (parameter.Type == JTokenType.String)
                {
                    var stringValue = parameter.Value <string>();
                    #region int, long, byte, bool, decimal, float, double
                    if (expectedType == typeof(int))
                    {
                        if (int.TryParse(stringValue, out var v))
                        {
                            parsed = v;
                            return(true);
                        }
                    }
                    else if (expectedType == typeof(long))
                    {
                        if (long.TryParse(stringValue, out var v))
                        {
                            parsed = v;
                            return(true);
                        }
                    }
                    else if (expectedType == typeof(byte))
                    {
                        if (byte.TryParse(stringValue, out var v))
                        {
                            parsed = v;
                            return(true);
                        }
                    }
                    else if (expectedType == typeof(bool))
                    {
                        if (bool.TryParse(stringValue, out var v))
                        {
                            parsed = v;
                            return(true);
                        }
                    }
                    else if (expectedType == typeof(decimal))
                    {
                        if (decimal.TryParse(stringValue, out var v))
                        {
                            parsed = v;
                            return(true);
                        }
                        if (decimal.TryParse(stringValue, NumberStyles.Any, CultureInfo.InvariantCulture, out v))
                        {
                            parsed = v;
                            return(true);
                        }
                    }
                    else if (expectedType == typeof(float))
                    {
                        if (float.TryParse(stringValue, out var v))
                        {
                            parsed = v;
                            return(true);
                        }
                        if (float.TryParse(stringValue, NumberStyles.Any, CultureInfo.InvariantCulture, out v))
                        {
                            parsed = v;
                            return(true);
                        }
                    }
                    else if (expectedType == typeof(double))
                    {
                        if (double.TryParse(stringValue, out var v))
                        {
                            parsed = v;
                            return(true);
                        }
                        if (double.TryParse(stringValue, NumberStyles.Any, CultureInfo.InvariantCulture, out v))
                        {
                            parsed = v;
                            return(true);
                        }
                    }
                    #endregion
                    #region string[]
                    else if (expectedType == typeof(ODataArray <string>))
                    {
                        try
                        {
                            parsed = new ODataArray <string>(stringValue);
                            return(true);
                        }
                        catch { /* ignored */ }
                    }
                    else if (expectedType == typeof(List <string>))
                    {
                        parsed = new List <string> {
                            stringValue
                        };
                        return(true);
                    }
                    else if (expectedType == typeof(string[]) || expectedType == typeof(IEnumerable <string>))
                    {
                        parsed = new[] { stringValue };
                        return(true);
                    }
                    #endregion
                    #region int[]
                    else if (expectedType == typeof(ODataArray <int>))
                    {
                        try
                        {
                            parsed = new ODataArray <int>(stringValue);
                            return(true);
                        }
                        catch { /* ignored */ }
                    }
                    else if (typeof(IEnumerable <int>).IsAssignableFrom(expectedType))
                    {
                        if (int.TryParse(stringValue, out var v))
                        {
                            if (expectedType == typeof(List <int>))
                            {
                                parsed = new List <int> {
                                    v
                                }
                            }
                            ;
                            else
                            {
                                parsed = new[] { v }
                            };
                            return(true);
                        }
                    }
                    #endregion
                    #region long[]
                    else if (expectedType == typeof(ODataArray <long>))
                    {
                        try
                        {
                            parsed = new ODataArray <long>(stringValue);
                            return(true);
                        }
                        catch { /* ignored */ }
                    }
                    else if (typeof(IEnumerable <long>).IsAssignableFrom(expectedType))
                    {
                        if (long.TryParse(stringValue, out var v))
                        {
                            if (expectedType == typeof(List <long>))
                            {
                                parsed = new List <long> {
                                    v
                                }
                            }
                            ;
                            else
                            {
                                parsed = new[] { v }
                            };
                            return(true);
                        }
                    }
                    #endregion
                    #region byte[]
                    else if (expectedType == typeof(ODataArray <byte>))
                    {
                        try
                        {
                            parsed = new ODataArray <byte>(stringValue);
                            return(true);
                        }
                        catch { /* ignored */ }
                    }
                    else if (typeof(IEnumerable <byte>).IsAssignableFrom(expectedType))
                    {
                        if (byte.TryParse(stringValue, out var v))
                        {
                            if (expectedType == typeof(List <byte>))
                            {
                                parsed = new List <byte> {
                                    v
                                }
                            }
                            ;
                            else
                            {
                                parsed = new[] { v }
                            };
                            return(true);
                        }
                    }
                    #endregion
                    #region bool[]
                    else if (expectedType == typeof(ODataArray <bool>))
                    {
                        try
                        {
                            parsed = new ODataArray <bool>(stringValue);
                            return(true);
                        }
                        catch { /* ignored */ }
                    }
                    else if (typeof(IEnumerable <bool>).IsAssignableFrom(expectedType))
                    {
                        if (bool.TryParse(stringValue, out var v))
                        {
                            if (expectedType == typeof(List <bool>))
                            {
                                parsed = new List <bool> {
                                    v
                                }
                            }
                            ;
                            else
                            {
                                parsed = new[] { v }
                            };
                            return(true);
                        }
                    }
                    #endregion
                    #region decimal[]
                    else if (expectedType == typeof(ODataArray <decimal>))
                    {
                        try
                        {
                            parsed = new ODataArray <decimal>(stringValue);
                            return(true);
                        }
                        catch { /* ignored */ }
                    }
                    else if (typeof(IEnumerable <decimal>).IsAssignableFrom(expectedType))
                    {
                        if (decimal.TryParse(stringValue, out var v) ||
                            decimal.TryParse(stringValue, NumberStyles.Any, CultureInfo.InvariantCulture, out v))
                        {
                            if (expectedType == typeof(List <decimal>))
                            {
                                parsed = new List <decimal> {
                                    v
                                }
                            }
                            ;
                            else
                            {
                                parsed = new[] { v }
                            };
                            return(true);
                        }
                    }
                    #endregion
                    #region float[]
                    else if (expectedType == typeof(ODataArray <float>))
                    {
                        try
                        {
                            parsed = new ODataArray <float>(stringValue);
                            return(true);
                        }
                        catch { /* ignored */ }
                    }
                    else if (typeof(IEnumerable <float>).IsAssignableFrom(expectedType))
                    {
                        if (float.TryParse(stringValue, out var v) ||
                            float.TryParse(stringValue, NumberStyles.Any, CultureInfo.InvariantCulture, out v))
                        {
                            if (expectedType == typeof(List <float>))
                            {
                                parsed = new List <float> {
                                    v
                                }
                            }
                            ;
                            else
                            {
                                parsed = new[] { v }
                            };
                            return(true);
                        }
                    }
                    #endregion
                    #region double[]
                    else if (expectedType == typeof(ODataArray <double>))
                    {
                        try
                        {
                            parsed = new ODataArray <double>(stringValue);
                            return(true);
                        }
                        catch { /* ignored */ }
                    }
                    else if (typeof(IEnumerable <double>).IsAssignableFrom(expectedType))
                    {
                        if (double.TryParse(stringValue, out var v) ||
                            double.TryParse(stringValue, NumberStyles.Any, CultureInfo.InvariantCulture, out v))
                        {
                            if (expectedType == typeof(List <double>))
                            {
                                parsed = new List <double> {
                                    v
                                }
                            }
                            ;
                            else
                            {
                                parsed = new[] { v }
                            };
                            return(true);
                        }
                    }
                    #endregion

                    else if (typeof(ODataArray).IsAssignableFrom(expectedType))
                    {
                        try
                        {
                            parsed = ODataTools.CreateODataArray(expectedType, stringValue);
                            return(true);
                        }
                        catch { /* ignored */ }
                    }

                    //TODO: try parse further opportunities from string to "expectedType"
                }
            }

            parsed = null;
            return(false);
        }
コード例 #30
0
 [ODataFunction] public static IEnumerable <long> Optional_ODataArray_Long(Content content, ODataArray <long> a = null) => a;