瀏覽代碼

Allow access to declared Members on DynamicObject (#858)

Bernhard Windisch 4 年之前
父節點
當前提交
90eca8b996
共有 2 個文件被更改,包括 18 次插入7 次删除
  1. 13 2
      Jint.Tests/Runtime/InteropTests.cs
  2. 5 5
      Jint/Runtime/Interop/ObjectWrapper.cs

+ 13 - 2
Jint.Tests/Runtime/InteropTests.cs

@@ -2344,12 +2344,17 @@ namespace Jint.Tests.Runtime
             Assert.Equal("a", engine.Execute("test.a").GetCompletionValue().AsString());
             Assert.Equal("b", engine.Execute("test.b").GetCompletionValue().AsString());
 
-            engine.Execute("test.a = 5; test.b = 10;");
+            engine.Execute("test.a = 5; test.b = 10; test.Name = 'Jint'");
 
             Assert.Equal(5, engine.Execute("test.a").GetCompletionValue().AsNumber());
             Assert.Equal(10, engine.Execute("test.b").GetCompletionValue().AsNumber());
+
+            Assert.Equal("Jint", engine.Execute("test.Name").GetCompletionValue().AsString());
+            Assert.True(engine.Execute("test.ContainsKey('a')").GetCompletionValue().AsBoolean());
+            Assert.True(engine.Execute("test.ContainsKey('b')").GetCompletionValue().AsBoolean());
+            Assert.False(engine.Execute("test.ContainsKey('c')").GetCompletionValue().AsBoolean());
         }
-        
+
         private class DynamicClass : DynamicObject
         {
             private readonly Dictionary<string, object> _properties = new Dictionary<string, object>();
@@ -2369,6 +2374,12 @@ namespace Jint.Tests.Runtime
                 _properties[binder.Name] = value;
                 return true;
             }
+
+            public string Name { get; set; }
+            public bool ContainsKey(string key)
+            {
+                return _properties.ContainsKey(key);
+            }
         }
             
         [Fact]

+ 5 - 5
Jint/Runtime/Interop/ObjectWrapper.cs

@@ -266,11 +266,6 @@ namespace Jint.Runtime.Interop
 
         private static ReflectionAccessor ResolvePropertyDescriptorFactory(Engine engine, Type type, string memberName)
         {
-            if (typeof(DynamicObject).IsAssignableFrom(type))
-            {
-                return new DynamicObjectAccessor(typeof(void), memberName);
-            }
-            
             var isNumber = uint.TryParse(memberName, out _);
 
             // we can always check indexer if there's one, and then fall back to properties if indexer returns null
@@ -282,6 +277,11 @@ namespace Jint.Runtime.Interop
                 return temp;
             }
 
+            if (typeof(DynamicObject).IsAssignableFrom(type))
+            {
+                return new DynamicObjectAccessor(type, memberName);
+            }
+
             // if no methods are found check if target implemented indexing
             if (indexerAccessor != null)
             {