using OpenTap.Addin.Annotation; using System.Collections.Concurrent; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; namespace OpenTap.Addin { public enum TestVariableType { String = 0, Int = 1, Double = 2, Bool = 3, Container = 8, Refrence = 9 } public class TestVariable : INotifyPropertyChanged { #region ... public event PropertyChangedEventHandler PropertyChanged; protected void Set([CallerMemberName] string name = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); } protected void Set(ref T old, T @new, [CallerMemberName] string propertyName = null) { old = @new; if (propertyName != null) { Set(propertyName); } } #endregion private string name; [DataGridCol("名称", "*", false)] public string Name { get => name; set { Set(ref name, value); } } public bool IsArray { get; set; } private TestVariableType type; [DataGridCol("类型", "*", false)] public TestVariableType Type { get => type; set { Set(ref type, value); } } [DataGridCol("值", "*", false)] public string Value { get; set; } private ObservableCollection children = new ObservableCollection(); public ObservableCollection Children { get => children; set { Set(ref children, value); } } public object GetValue() { if (Type == TestVariableType.Int) { if (int.TryParse(Value, out int intValue)) return intValue; } else if (Type == TestVariableType.Double) { if (double.TryParse(Value, out double doubleValue)) return doubleValue; } else if (Type == TestVariableType.Bool) { if (bool.TryParse(Value, out bool boolValue)) return boolValue; } else if (Type == TestVariableType.String) { return Value; } return null; } public RuntimeVariable ToRuntime() { if (IsArray) { switch (Type) { case TestVariableType.String: return new RuntimeVariable { Name = Name, Type = typeof(string[]), TypeName = "string[]", data = Children.Select(e => e.GetValue()).ToArray() }; case TestVariableType.Int: return new RuntimeVariable { Name = Name, Type = typeof(int[]), TypeName = "int[]", data = Children.Select(e => e.GetValue()).ToArray() }; case TestVariableType.Double: return new RuntimeVariable { Name = Name, Type = typeof(double[]), TypeName = "double[]", data = Children.Select(e => e.GetValue()).ToArray() }; case TestVariableType.Bool: return new RuntimeVariable { Name = Name, Type = typeof(bool[]), TypeName = "bool[]", data = Children.Select(e => e.GetValue()).ToArray() }; case TestVariableType.Container: return new RuntimeVariable { Name = Name, Type = typeof(object[]), TypeName = "Container[]", data = new VariableContext(new ConcurrentDictionary (Children.Select(e => e.ToRuntime()).ToDictionary(v => v.Name, v => v))) }; } } else { switch (Type) { case TestVariableType.String: return new RuntimeVariable { Name = Name, Type = typeof(string), TypeName = "string", data = Value }; case TestVariableType.Int: return new RuntimeVariable { Name = Name, Type = typeof(int), TypeName = "int", data = int.Parse(Value) }; case TestVariableType.Double: return new RuntimeVariable { Name = Name, Type = typeof(double), TypeName = "double", data = double.Parse(Value) }; case TestVariableType.Bool: return new RuntimeVariable { Name = Name, Type = typeof(bool), TypeName = "bool", data = bool.Parse(Value) }; case TestVariableType.Container: return new RuntimeVariable { Name = Name, Type = typeof(object[]), TypeName = "object", data = new VariableContext(new ConcurrentDictionary (Children.Select(e => e.ToRuntime()).ToDictionary(v => v.Name, v => v))) }; } } return null; } public static string DefaultValue(TestVariableType type) { switch (type) { case TestVariableType.String: return string.Empty; case TestVariableType.Int: return "0"; case TestVariableType.Double: return "0"; case TestVariableType.Bool: return "False"; default: return null; } } } }