From 5f4315421206027337dbc70b8d7ca597782c6560 Mon Sep 17 00:00:00 2001 From: AlisherAmonulloev Date: Fri, 7 Nov 2025 12:04:25 +0200 Subject: [PATCH 01/11] Update DynamicClassBridge.cs --- net/DevExtreme.AspNet.Data/Types/DynamicClassBridge.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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); } From a0912f3236edf03787a75e9c9b353525129fe09e Mon Sep 17 00:00:00 2001 From: AlisherAmonulloev Date: Wed, 22 Apr 2026 18:59:07 +0300 Subject: [PATCH 02/11] Added test for the updated function --- .../DynamicClassTests.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs b/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs index f88b5fdae..d46edef75 100644 --- a/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs +++ b/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs @@ -93,6 +93,22 @@ 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"]); + } + } } From ca8db82d7e95e05a0b7c07f72e89c827ae200d44 Mon Sep 17 00:00:00 2001 From: Mikhail Preyskurantov <5574159+mpreyskurantov@users.noreply.github.com> Date: Thu, 23 Apr 2026 16:16:24 +0300 Subject: [PATCH 03/11] added another pure reflection test --- .../DynamicClassTests.cs | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs b/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs index d46edef75..e74462f4d 100644 --- a/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs +++ b/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs @@ -1,6 +1,10 @@ using DevExtreme.AspNet.Data.ResponseModel; +using DevExtreme.AspNet.Data.Types; + using System; using System.Linq; +using System.Reflection; + using Xunit; namespace DevExtreme.AspNet.Data.Tests { @@ -109,6 +113,27 @@ public void Select_WithMoreThan32Fields_ReturnsValues() { 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 }); + } + } } From 7e838f46732983443d87264d9723c75186a69680 Mon Sep 17 00:00:00 2001 From: Mikhail Preyskurantov <5574159+mpreyskurantov@users.noreply.github.com> Date: Thu, 23 Apr 2026 16:20:50 +0300 Subject: [PATCH 04/11] Revert "added another pure reflection test" This reverts commit ca8db82d7e95e05a0b7c07f72e89c827ae200d44. --- .../DynamicClassTests.cs | 25 ------------------- 1 file changed, 25 deletions(-) diff --git a/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs b/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs index e74462f4d..d46edef75 100644 --- a/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs +++ b/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs @@ -1,10 +1,6 @@ using DevExtreme.AspNet.Data.ResponseModel; -using DevExtreme.AspNet.Data.Types; - using System; using System.Linq; -using System.Reflection; - using Xunit; namespace DevExtreme.AspNet.Data.Tests { @@ -113,27 +109,6 @@ public void Select_WithMoreThan32Fields_ReturnsValues() { 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 }); - } - } } From 3198a530c4f02c2f1a8887676eb25315424ccb15 Mon Sep 17 00:00:00 2001 From: Mikhail Preyskurantov <5574159+mpreyskurantov@users.noreply.github.com> Date: Thu, 23 Apr 2026 16:21:03 +0300 Subject: [PATCH 05/11] Revert "Added test for the updated function" This reverts commit a0912f3236edf03787a75e9c9b353525129fe09e. --- .../DynamicClassTests.cs | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs b/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs index d46edef75..f88b5fdae 100644 --- a/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs +++ b/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs @@ -93,22 +93,6 @@ 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"]); - } - } } From 7bd44eb86d9d0c3c36d09912c81fb4ecb0b33c85 Mon Sep 17 00:00:00 2001 From: Mikhail Preyskurantov <5574159+mpreyskurantov@users.noreply.github.com> Date: Thu, 23 Apr 2026 16:21:21 +0300 Subject: [PATCH 06/11] Revert "Update DynamicClassBridge.cs" This reverts commit 5f4315421206027337dbc70b8d7ca597782c6560. --- net/DevExtreme.AspNet.Data/Types/DynamicClassBridge.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/net/DevExtreme.AspNet.Data/Types/DynamicClassBridge.cs b/net/DevExtreme.AspNet.Data/Types/DynamicClassBridge.cs index 8bf578ffe..0baf44c64 100644 --- a/net/DevExtreme.AspNet.Data/Types/DynamicClassBridge.cs +++ b/net/DevExtreme.AspNet.Data/Types/DynamicClassBridge.cs @@ -23,10 +23,7 @@ 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"); - - 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); + INDEXER_METHOD = CLASS_TYPE.GetMethod("get_Item"); } catch(FileNotFoundException x) { throw new Exception("Please install 'System.Linq.Dynamic.Core' package", x); } From 6157ed8565dd65660f8f4f9ef2dee7a674e9deb4 Mon Sep 17 00:00:00 2001 From: Mikhail Preyskurantov <5574159+mpreyskurantov@users.noreply.github.com> Date: Thu, 23 Apr 2026 16:24:45 +0300 Subject: [PATCH 07/11] bump System.Linq.Dynamic.Core to 1.6.8 --- net/Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 @@ - + From 449e927790d950a5f2b65406406200e0d1fb3fc3 Mon Sep 17 00:00:00 2001 From: Mikhail Preyskurantov <5574159+mpreyskurantov@users.noreply.github.com> Date: Thu, 23 Apr 2026 16:30:27 +0300 Subject: [PATCH 08/11] Reapply "Added test for the updated function" This reverts commit 3198a530c4f02c2f1a8887676eb25315424ccb15. --- .../DynamicClassTests.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs b/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs index f88b5fdae..d46edef75 100644 --- a/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs +++ b/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs @@ -93,6 +93,22 @@ 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"]); + } + } } From 7da85b152f71fd51e9df40db4942f12138475fc8 Mon Sep 17 00:00:00 2001 From: Mikhail Preyskurantov <5574159+mpreyskurantov@users.noreply.github.com> Date: Thu, 23 Apr 2026 16:30:39 +0300 Subject: [PATCH 09/11] Reapply "added another pure reflection test" This reverts commit 7e838f46732983443d87264d9723c75186a69680. --- .../DynamicClassTests.cs | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs b/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs index d46edef75..e74462f4d 100644 --- a/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs +++ b/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs @@ -1,6 +1,10 @@ using DevExtreme.AspNet.Data.ResponseModel; +using DevExtreme.AspNet.Data.Types; + using System; using System.Linq; +using System.Reflection; + using Xunit; namespace DevExtreme.AspNet.Data.Tests { @@ -109,6 +113,27 @@ public void Select_WithMoreThan32Fields_ReturnsValues() { 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 }); + } + } } From 8d09fb5e168061ae6e0ed3f57ca148ddb2f62ed1 Mon Sep 17 00:00:00 2001 From: Mikhail Preyskurantov <5574159+mpreyskurantov@users.noreply.github.com> Date: Thu, 23 Apr 2026 16:33:44 +0300 Subject: [PATCH 10/11] using --- net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs b/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs index e74462f4d..f7614088c 100644 --- a/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs +++ b/net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs @@ -2,6 +2,7 @@ using DevExtreme.AspNet.Data.Types; using System; +using System.Collections.Generic; using System.Linq; using System.Reflection; @@ -108,7 +109,7 @@ public void Select_WithMoreThan32Fields_ReturnsValues() { }; var loadResult = DataSourceLoader.Load(source, loadOptions); - var item = loadResult.data.Cast>().First(); + var item = loadResult.data.Cast>().First(); Assert.Equal(42, item["p"]); } From 4ce550fc8c56bb508f6b4e1156342dc415e3ae17 Mon Sep 17 00:00:00 2001 From: Mikhail Preyskurantov <5574159+mpreyskurantov@users.noreply.github.com> Date: Thu, 23 Apr 2026 16:35:12 +0300 Subject: [PATCH 11/11] Reapply "Update DynamicClassBridge.cs" This reverts commit 7bd44eb86d9d0c3c36d09912c81fb4ecb0b33c85. --- net/DevExtreme.AspNet.Data/Types/DynamicClassBridge.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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); }