diff --git a/src/System.Linq.Dynamic.Core/DynamicClass.cs b/src/System.Linq.Dynamic.Core/DynamicClass.cs index 4498e4e8..5dee90d3 100644 --- a/src/System.Linq.Dynamic.Core/DynamicClass.cs +++ b/src/System.Linq.Dynamic.Core/DynamicClass.cs @@ -18,7 +18,7 @@ namespace System.Linq.Dynamic.Core; /// public abstract class DynamicClass : DynamicObject { - private Dictionary? _propertiesDictionary = null; + private Dictionary? _propertiesDictionary; private Dictionary Properties { @@ -27,6 +27,7 @@ public abstract class DynamicClass : DynamicObject if (_propertiesDictionary == null) { _propertiesDictionary = new(); + foreach (PropertyInfo pi in GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance)) { int parameters = pi.GetIndexParameters().Length; @@ -150,7 +151,7 @@ public override bool TryGetMember(GetMemberBinder binder, out object? result) /// /// 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.) /// - public override bool TrySetMember(SetMemberBinder binder, object value) + public override bool TrySetMember(SetMemberBinder binder, object? value) { string name = binder.Name; if (Properties.ContainsKey(name)) diff --git a/test/System.Linq.Dynamic.Core.Tests.Net6/DynamicClassTest.cs b/test/System.Linq.Dynamic.Core.Tests.Net6/DynamicClassTest.cs deleted file mode 100644 index 44e6b7ec..00000000 --- a/test/System.Linq.Dynamic.Core.Tests.Net6/DynamicClassTest.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Collections.Generic; -using FluentAssertions; -using Xunit; - -namespace System.Linq.Dynamic.Core.Tests -{ - public class DynamicClassTest - { - [Fact] - public void GetPropertiesWorks() - { - // Arrange - var range = new List - { - new { FieldName = "TestFieldName", Value = 3.14159 } - }; - - // Act - var rangeResult = range.AsQueryable().Select("new(FieldName as FieldName)").ToDynamicList(); - var item = rangeResult.FirstOrDefault(); - - var call = () => item.GetDynamicMemberNames(); - call.Should().NotThrow(); - call.Should().NotThrow(); - } - } -} \ No newline at end of file diff --git a/test/System.Linq.Dynamic.Core.Tests/DynamicClassTest.cs b/test/System.Linq.Dynamic.Core.Tests/DynamicClassTest.cs new file mode 100644 index 00000000..59464287 --- /dev/null +++ b/test/System.Linq.Dynamic.Core.Tests/DynamicClassTest.cs @@ -0,0 +1,101 @@ +using System.Collections.Generic; +using FluentAssertions; +using Xunit; + +namespace System.Linq.Dynamic.Core.Tests; + +public class DynamicClassTest +{ + [Fact] + public void DynamicClass_GetProperties_Should_Work() + { + // Arrange + var range = new List + { + new { FieldName = "TestFieldName", Value = 3.14159 } + }; + + // Act + var rangeResult = range.AsQueryable().Select("new(FieldName as FieldName)").ToDynamicList(); + var item = rangeResult.First(); + + var call = () => item.GetDynamicMemberNames(); + call.Should().NotThrow(); + } + + [Fact] + public void DynamicClass_GetPropertyValue_Should_Work() + { + // Arrange + var test = "Test"; + var range = new List + { + new { FieldName = test, Value = 3.14159 } + }; + + // Act + var rangeResult = range.AsQueryable().Select("new(FieldName as FieldName)").ToDynamicList(); + var item = rangeResult.First(); + + var value = item.FieldName as string; + value.Should().Be(test); + } + + [Fact] + public void DynamicClass_GettingValue_ByIndex_Should_Work() + { + // Arrange + var test = "Test"; + var range = new List + { + new { FieldName = test, Value = 3.14159 } + }; + + // Act + var rangeResult = range.AsQueryable().Select("new(FieldName as FieldName)").ToDynamicList(); + var item = rangeResult.First(); + + var value = item["FieldName"] as string; + value.Should().Be(test); + } + + [Fact] + public void DynamicClass_SettingExistingPropertyValue_ByIndex_Should_Work() + { + // Arrange + var test = "Test"; + var newTest = "abc"; + var range = new List + { + new { FieldName = test, Value = 3.14159 } + }; + + // Act + var rangeResult = range.AsQueryable().Select("new(FieldName as FieldName)").ToDynamicList(); + var item = rangeResult.First(); + + item["FieldName"] = newTest; + var value = item["FieldName"] as string; + value.Should().Be(newTest); + } + + [Fact] + public void DynamicClass_SettingNewProperty_ByIndex_Should_Work() + { + // Arrange + var test = "Test"; + var newTest = "abc"; + var range = new List + { + new { FieldName = test, Value = 3.14159 } + }; + + // Act + var rangeResult = range.AsQueryable().Select("new(FieldName as FieldName)").ToDynamicList(); + var item = rangeResult.First(); + + item["X"] = newTest; + var value = item["X"] as string; + value.Should().Be(newTest); + } +} \ No newline at end of file