2
0
Эх сурвалжийг харах

Try initialize interop object members with upper and lower first char (#1795)

Marko Lahma 1 жил өмнө
parent
commit
107f543329

+ 22 - 0
Jint.Tests/Runtime/InteropTests.MemberAccess.cs

@@ -234,5 +234,27 @@ namespace Jint.Tests.Runtime
             public bool TryGetValue(string key, [MaybeNullWhen(false)] out TValue value) => _dictionary.TryGetValue(key, out value);
             IEnumerator IEnumerable.GetEnumerator() => _dictionary.GetEnumerator();
         }
+
+        public class ClassWithData
+        {
+            public DataType Data { get; set; }
+
+            public class DataType
+            {
+                public string Value { get; set; }
+            }
+        }
+
+        [Fact]
+        public void NewTypedObjectFromUntypedInitializerShouldBeMapped()
+        {
+            var engine = new Engine();
+
+            engine.SetValue("obj", new ClassWithData());
+            engine.Execute(@"obj.Data = { Value: '123' };");
+            var obj = engine.Evaluate("obj").ToObject() as ClassWithData;
+
+            Assert.Equal("123", obj?.Data.Value);
+        }
     }
 }

+ 2 - 2
Jint/Runtime/Interop/DefaultTypeConverter.cs

@@ -227,8 +227,8 @@ namespace Jint.Runtime.Interop
                         continue;
                     }
 
-                    var name = member.Name.UpperToLowerCamelCase();
-                    if (typeDescriptor.TryGetValue(value, name, out var val))
+                    if (typeDescriptor.TryGetValue(value, member.Name, out var val)
+                        || typeDescriptor.TryGetValue(value, member.Name.UpperToLowerCamelCase(), out val))
                     {
                         var output = Convert(val, member.GetDefinedType(), formatProvider);
                         member.SetValue(obj, output);

+ 2 - 2
Jint/Runtime/Interop/TypeDescriptor.cs

@@ -192,7 +192,7 @@ namespace Jint.Runtime.Interop
             // we could throw when indexing with an invalid key
             try
             {
-                var parameters = new[] { member, _valueType!.IsValueType ? Activator.CreateInstance(_valueType) : null };
+                object?[] parameters = [member, _valueType!.IsValueType ? Activator.CreateInstance(_valueType) : null];
                 var result = (bool) _tryGetValueMethod!.Invoke(target, parameters)!;
                 o = parameters[1];
                 return result;
@@ -211,7 +211,7 @@ namespace Jint.Runtime.Interop
                 return false;
             }
 
-            return (bool) _removeMethod.Invoke(target, new object[] { key })!;
+            return (bool) _removeMethod.Invoke(target, [key])!;
         }
 
         public ICollection<string> GetKeys(object target)