chr
2026-04-05 fe750b791d5b517cc4e9bc8e99a9a75139a0cfba
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
using System.Collections.Concurrent;
using System.Dynamic;
 
namespace OpenTap.Addin
{
    public class VariableContext : DynamicObject
    {
        private static readonly char SPLIT_MARK = '.';
 
        private readonly ConcurrentDictionary<string, RuntimeVariable> Variables;
 
        public VariableContext(ConcurrentDictionary<string, RuntimeVariable> variables)
        {
            Variables = variables;
        }
 
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            result = null;
            string name = binder.Name;
            if (Variables.TryGetValue(name, out var variable))
            {
                result = variable.data;
                return true;
            }
            return false;
        }
 
        public override bool TrySetMember(SetMemberBinder binder, object value)
        {
            string name = binder.Name;
            if (Variables.TryGetValue(name, out var variable))
            {
                variable.data = value;
                return true;
            }
            else
            {
                var v = new RuntimeVariable
                {
                    Name = name,
                    data = value,
                    Type = value.GetType(),
                    TypeName = value.GetType().Name,
                };
                Variables[name] = v;
                return true;
            }
        }
 
        public void Merge(VariableContext source)
        {
            if (source?.Variables != null)
            {
                foreach (var key in source.Variables.Keys)
                {
                    Variables[key] = source.Variables[key];
                }
            }
        }
 
        public void Merge(ConcurrentDictionary<string, RuntimeVariable> Variables)
        {
            if (Variables != null)
            {
                foreach (var key in Variables.Keys)
                {
                    this.Variables[key] = Variables[key];
                }
            }
        }
    }
}