Skip to content

Commit 49326aa

Browse files
authored
Fixed accessing dynamic properties by index (#637)
1 parent c1a9771 commit 49326aa

File tree

3 files changed

+104
-29
lines changed

3 files changed

+104
-29
lines changed

src/System.Linq.Dynamic.Core/DynamicClass.cs

+3-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ namespace System.Linq.Dynamic.Core;
1818
/// </summary>
1919
public abstract class DynamicClass : DynamicObject
2020
{
21-
private Dictionary<string, object?>? _propertiesDictionary = null;
21+
private Dictionary<string, object?>? _propertiesDictionary;
2222

2323
private Dictionary<string, object?> Properties
2424
{
@@ -27,6 +27,7 @@ public abstract class DynamicClass : DynamicObject
2727
if (_propertiesDictionary == null)
2828
{
2929
_propertiesDictionary = new();
30+
3031
foreach (PropertyInfo pi in GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
3132
{
3233
int parameters = pi.GetIndexParameters().Length;
@@ -150,7 +151,7 @@ public override bool TryGetMember(GetMemberBinder binder, out object? result)
150151
/// <returns>
151152
/// true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the language determines the behavior. (In most cases, a language-specific run-time exception is thrown.)
152153
/// </returns>
153-
public override bool TrySetMember(SetMemberBinder binder, object value)
154+
public override bool TrySetMember(SetMemberBinder binder, object? value)
154155
{
155156
string name = binder.Name;
156157
if (Properties.ContainsKey(name))

test/System.Linq.Dynamic.Core.Tests.Net6/DynamicClassTest.cs

-27
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
using System.Collections.Generic;
2+
using FluentAssertions;
3+
using Xunit;
4+
5+
namespace System.Linq.Dynamic.Core.Tests;
6+
7+
public class DynamicClassTest
8+
{
9+
[Fact]
10+
public void DynamicClass_GetProperties_Should_Work()
11+
{
12+
// Arrange
13+
var range = new List<object>
14+
{
15+
new { FieldName = "TestFieldName", Value = 3.14159 }
16+
};
17+
18+
// Act
19+
var rangeResult = range.AsQueryable().Select("new(FieldName as FieldName)").ToDynamicList();
20+
var item = rangeResult.First();
21+
22+
var call = () => item.GetDynamicMemberNames();
23+
call.Should().NotThrow();
24+
}
25+
26+
[Fact]
27+
public void DynamicClass_GetPropertyValue_Should_Work()
28+
{
29+
// Arrange
30+
var test = "Test";
31+
var range = new List<object>
32+
{
33+
new { FieldName = test, Value = 3.14159 }
34+
};
35+
36+
// Act
37+
var rangeResult = range.AsQueryable().Select("new(FieldName as FieldName)").ToDynamicList();
38+
var item = rangeResult.First();
39+
40+
var value = item.FieldName as string;
41+
value.Should().Be(test);
42+
}
43+
44+
[Fact]
45+
public void DynamicClass_GettingValue_ByIndex_Should_Work()
46+
{
47+
// Arrange
48+
var test = "Test";
49+
var range = new List<object>
50+
{
51+
new { FieldName = test, Value = 3.14159 }
52+
};
53+
54+
// Act
55+
var rangeResult = range.AsQueryable().Select("new(FieldName as FieldName)").ToDynamicList();
56+
var item = rangeResult.First();
57+
58+
var value = item["FieldName"] as string;
59+
value.Should().Be(test);
60+
}
61+
62+
[Fact]
63+
public void DynamicClass_SettingExistingPropertyValue_ByIndex_Should_Work()
64+
{
65+
// Arrange
66+
var test = "Test";
67+
var newTest = "abc";
68+
var range = new List<object>
69+
{
70+
new { FieldName = test, Value = 3.14159 }
71+
};
72+
73+
// Act
74+
var rangeResult = range.AsQueryable().Select("new(FieldName as FieldName)").ToDynamicList();
75+
var item = rangeResult.First();
76+
77+
item["FieldName"] = newTest;
78+
var value = item["FieldName"] as string;
79+
value.Should().Be(newTest);
80+
}
81+
82+
[Fact]
83+
public void DynamicClass_SettingNewProperty_ByIndex_Should_Work()
84+
{
85+
// Arrange
86+
var test = "Test";
87+
var newTest = "abc";
88+
var range = new List<object>
89+
{
90+
new { FieldName = test, Value = 3.14159 }
91+
};
92+
93+
// Act
94+
var rangeResult = range.AsQueryable().Select("new(FieldName as FieldName)").ToDynamicList();
95+
var item = rangeResult.First();
96+
97+
item["X"] = newTest;
98+
var value = item["X"] as string;
99+
value.Should().Be(newTest);
100+
}
101+
}

0 commit comments

Comments
 (0)