Skip to content

Commit 182e124

Browse files
DataSourceLoader - Update DynamicClassBridge class to use renamed DynamicClass indexer in System.Linq.Dynamic.Core v1.6.8 (#683)
Co-authored-by: Mikhail Preyskurantov <5574159+mpreyskurantov@users.noreply.github.com>
1 parent 58561da commit 182e124

3 files changed

Lines changed: 47 additions & 2 deletions

File tree

net/DevExtreme.AspNet.Data.Tests/DynamicClassTests.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
using DevExtreme.AspNet.Data.ResponseModel;
2+
using DevExtreme.AspNet.Data.Types;
3+
24
using System;
5+
using System.Collections.Generic;
36
using System.Linq;
7+
using System.Reflection;
8+
49
using Xunit;
510

611
namespace DevExtreme.AspNet.Data.Tests {
@@ -93,6 +98,43 @@ public void Select() {
9398
);
9499
}
95100

101+
[Fact]
102+
public void Select_WithMoreThan32Fields_ReturnsValues() {
103+
var source = new[] { new { p = 42 } };
104+
105+
var loadOptions = new SampleLoadOptions {
106+
GuardNulls = false,
107+
RemoteSelect = true,
108+
Select = Enumerable.Repeat("p", 33).ToArray()
109+
};
110+
111+
var loadResult = DataSourceLoader.Load(source, loadOptions);
112+
var item = loadResult.data.Cast<IDictionary<string, object>>().First();
113+
114+
Assert.Equal(42, item["p"]);
115+
}
116+
117+
[Fact]
118+
public void DynamicClassBridge_Indexer_GetMember_RoundTripsValue() {
119+
var expectedValue = "test";
120+
var dynamicType = CallDynamicClassBridgeCreateType(new[] { typeof(string) });
121+
var instance = Activator.CreateInstance(dynamicType, expectedValue);
122+
Assert.Equal(expectedValue, CallDynamicClassBridgeGetIndexerMember(instance, 0));
123+
}
124+
125+
static MethodInfo GetDynamicClassBridgeMethod(string methodName) {
126+
var bridgeType = typeof(AnonType).Assembly.GetType("DevExtreme.AspNet.Data.Types.DynamicClassBridge");
127+
return bridgeType.GetMethod(methodName, BindingFlags.Public | BindingFlags.Static);
128+
}
129+
130+
static Type CallDynamicClassBridgeCreateType(Type[] memberTypes) {
131+
return (Type)GetDynamicClassBridgeMethod("CreateType").Invoke(null, new object[] { memberTypes });
132+
}
133+
134+
static object CallDynamicClassBridgeGetIndexerMember(object obj, int index) {
135+
return GetDynamicClassBridgeMethod("GetMember").Invoke(null, new object[] { obj, index });
136+
}
137+
96138
}
97139

98140
}

net/DevExtreme.AspNet.Data/Types/DynamicClassBridge.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@ static DynamicClassBridge() {
2323
PROP_TYPE = assembly.GetType("System.Linq.Dynamic.Core.DynamicProperty");
2424
#pragma warning restore DX0010,DX0004 // known assembly and types
2525
CREATE_TYPE_METHOD = FACTORY_TYPE.GetMethod("CreateType");
26-
INDEXER_METHOD = CLASS_TYPE.GetMethod("get_Item");
26+
27+
var indexerNameField = CLASS_TYPE.GetField("IndexerName", BindingFlags.NonPublic | BindingFlags.Static);
28+
var indexerName = indexerNameField?.GetValue(null) as string ?? "Item";
29+
INDEXER_METHOD = CLASS_TYPE.GetMethod("get_" + indexerName);
2730
} catch(FileNotFoundException x) {
2831
throw new Exception("Please install 'System.Linq.Dynamic.Core' package", x);
2932
}

net/Directory.Packages.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
<PackageVersion Include="Microsoft.Web.LibraryManager.Build" Version="2.1.175" />
1818
<PackageVersion Include="Newtonsoft.Json" Version="13.0.4" />
1919
<PackageVersion Include="System.Data.SqlClient" Version="4.8.6" />
20-
<PackageVersion Include="System.Linq.Dynamic.Core" Version="1.6.0" />
20+
<PackageVersion Include="System.Linq.Dynamic.Core" Version="1.6.8" />
2121
<PackageVersion Include="System.Net.Http" Version="4.3.4" />
2222
<PackageVersion Include="System.Text.Json" Version="8.0.6" />
2323
<PackageVersion Include="System.Text.RegularExpressions" Version="4.3.1" />

0 commit comments

Comments
 (0)