forked from sebastienros/jint
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDynamicObjectAccessor.cs
75 lines (63 loc) · 2.37 KB
/
DynamicObjectAccessor.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
using System.Dynamic;
using System.Reflection;
using Jint.Native;
#pragma warning disable IL2092
namespace Jint.Runtime.Interop.Reflection;
internal sealed class DynamicObjectAccessor : ReflectionAccessor
{
private JintSetMemberBinder? _setter;
private JintGetMemberBinder? _getter;
public DynamicObjectAccessor() : base(memberType: null)
{
}
public override bool Writable => true;
protected override object? DoGetValue(object target, string memberName)
{
var dynamicObject = (DynamicObject) target;
var getter = _getter ??= new JintGetMemberBinder(memberName, ignoreCase: true);
dynamicObject.TryGetMember(getter, out var result);
return result;
}
protected override void DoSetValue(object target, string memberName, object? value)
{
var dynamicObject = (DynamicObject) target;
var setter = _setter ??= new JintSetMemberBinder(memberName, ignoreCase: true);
dynamicObject.TrySetMember(setter, value);
}
protected override object? ConvertValueToSet(Engine engine, object value)
{
// we expect value to be generally CLR type, convert when possible
return value switch
{
JsBoolean jsBoolean => jsBoolean._value ? JsBoolean.BoxedTrue : JsBoolean.BoxedFalse,
JsString jsString => jsString.ToString(),
JsNumber jsNumber => jsNumber._value,
JsNull => null,
JsUndefined => null,
_ => value
};
}
private sealed class JintGetMemberBinder : GetMemberBinder
{
public JintGetMemberBinder(string name, bool ignoreCase) : base(name, ignoreCase)
{
}
public override DynamicMetaObject FallbackGetMember(DynamicMetaObject target, DynamicMetaObject? errorSuggestion)
{
throw new NotImplementedException(nameof(FallbackGetMember) + " not implemented");
}
}
private sealed class JintSetMemberBinder : SetMemberBinder
{
public JintSetMemberBinder(string name, bool ignoreCase) : base(name, ignoreCase)
{
}
public override DynamicMetaObject FallbackSetMember(
DynamicMetaObject target,
DynamicMetaObject value,
DynamicMetaObject? errorSuggestion)
{
throw new NotImplementedException(nameof(FallbackSetMember) + " not implemented");
}
}
}