diff --git a/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs b/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs index f88b5fdae..f7614088c 100644 --- a/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs +++ b/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs @@ -1,6 +1,11 @@ using DevExtreme.AspNet.Data.ResponseModel; +using DevExtreme.AspNet.Data.Types; + using System; +using System.Collections.Generic; using System.Linq; +using System.Reflection; + using Xunit; namespace DevExtreme.AspNet.Data.Tests { @@ -93,6 +98,43 @@ public void Select() { ); } + [Fact] + public void Select_WithMoreThan32Fields_ReturnsValues() { + var source = new[] { new { p = 42 } }; + + var loadOptions = new SampleLoadOptions { + GuardNulls = false, + RemoteSelect = true, + Select = Enumerable.Repeat("p", 33).ToArray() + }; + + var loadResult = DataSourceLoader.Load(source, loadOptions); + var item = loadResult.data.Cast>().First(); + + Assert.Equal(42, item["p"]); + } + + [Fact] + public void DynamicClassBridge_Indexer_GetMember_RoundTripsValue() { + var expectedValue = "test"; + var dynamicType = CallDynamicClassBridgeCreateType(new[] { typeof(string) }); + var instance = Activator.CreateInstance(dynamicType, expectedValue); + Assert.Equal(expectedValue, CallDynamicClassBridgeGetIndexerMember(instance, 0)); + } + + static MethodInfo GetDynamicClassBridgeMethod(string methodName) { + var bridgeType = typeof(AnonType).Assembly.GetType("DevExtreme.AspNet.Data.Types.DynamicClassBridge"); + return bridgeType.GetMethod(methodName, BindingFlags.Public | BindingFlags.Static); + } + + static Type CallDynamicClassBridgeCreateType(Type[] memberTypes) { + return (Type)GetDynamicClassBridgeMethod("CreateType").Invoke(null, new object[] { memberTypes }); + } + + static object CallDynamicClassBridgeGetIndexerMember(object obj, int index) { + return GetDynamicClassBridgeMethod("GetMember").Invoke(null, new object[] { obj, index }); + } + } } diff --git a/net/DevExtreme.AspNet.Data/Types/DynamicClassBridge.cs b/net/DevExtreme.AspNet.Data/Types/DynamicClassBridge.cs index 0baf44c64..8bf578ffe 100644 --- a/net/DevExtreme.AspNet.Data/Types/DynamicClassBridge.cs +++ b/net/DevExtreme.AspNet.Data/Types/DynamicClassBridge.cs @@ -23,7 +23,10 @@ static DynamicClassBridge() { PROP_TYPE = assembly.GetType("System.Linq.Dynamic.Core.DynamicProperty"); #pragma warning restore DX0010,DX0004 // known assembly and types CREATE_TYPE_METHOD = FACTORY_TYPE.GetMethod("CreateType"); - INDEXER_METHOD = CLASS_TYPE.GetMethod("get_Item"); + + var indexerNameField = CLASS_TYPE.GetField("IndexerName", BindingFlags.NonPublic | BindingFlags.Static); + var indexerName = indexerNameField?.GetValue(null) as string ?? "Item"; + INDEXER_METHOD = CLASS_TYPE.GetMethod("get_" + indexerName); } catch(FileNotFoundException x) { throw new Exception("Please install 'System.Linq.Dynamic.Core' package", x); } diff --git a/net/Directory.Packages.props b/net/Directory.Packages.props index 208c9dc7c..baab10e96 100644 --- a/net/Directory.Packages.props +++ b/net/Directory.Packages.props @@ -16,7 +16,7 @@ - +