- Timestamp:
- 02/01/21 14:37:18 (3 years ago)
- Location:
- branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface
- Files:
-
- 28 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/AlgorithmConverter.cs
r17451 r17828 12 12 13 13 public override Type ConvertableType => typeof(IAlgorithm); 14 15 public override bool CanConvertType(Type t) => 16 t.GetInterfaces().Any(x => x == ConvertableType); 14 17 15 18 public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) { -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/BaseConverter.cs
r17477 r17828 12 12 { 13 13 public abstract int Priority { get; } 14 15 public abstract bool CanConvertType(Type t); 16 14 17 public abstract Type ConvertableType { get; } 15 18 -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/BatchRunConverter.cs
r17540 r17828 10 10 public override int Priority => 10; 11 11 public override Type ConvertableType => HEAL.Attic.Mapper.StaticCache.GetType(new Guid("E85407E0-18EC-4198-8321-9CF030FDF6D7")); 12 13 public override bool CanConvertType(Type t) => ConvertableType.IsAssignableFrom(t); 12 14 13 15 public override IJsonItem Extract(IItem value, IJsonItemConverter root) { … … 31 33 Maximum = int.MaxValue 32 34 }); 33 34 35 return batchRunJI; 35 36 } -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ConstrainedValueParameterConverter.cs
r17485 r17828 11 11 public override int Priority => 3; 12 12 public override Type ConvertableType => typeof(IConstrainedValueParameter<>); 13 14 public override bool CanConvertType(Type t) => 15 t.GetInterfaces().Any(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IConstrainedValueParameter<>)); 13 16 14 17 public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) { -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/EnumTypeConverter.cs
r17473 r17828 11 11 public override int Priority => 1; 12 12 public override Type ConvertableType => typeof(EnumValue<>); 13 14 public override bool CanConvertType(Type t) => 15 typeof(EnumValue<>).IsAssignableFrom(t) || 16 (t.IsGenericType && t.GetGenericTypeDefinition() == ConvertableType); 13 17 14 18 public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) => … … 25 29 Value = Enum.GetName(enumType, val), 26 30 ConcreteRestrictedItems = Enum.GetNames(enumType) 27 };31 }; 28 32 } 29 33 } -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ExperimentConverter.cs
r17540 r17828 11 11 public override int Priority => 10; 12 12 public override Type ConvertableType => HEAL.Attic.Mapper.StaticCache.GetType(new Guid("A8A4536B-54C1-4A17-AB58-A6006F7F394B")); 13 14 public override bool CanConvertType(Type t) => 15 ConvertableType.IsAssignableFrom(t); 13 16 14 17 public override IJsonItem Extract(IItem value, IJsonItemConverter root) { -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/LookupParameterConverter.cs
r17471 r17828 10 10 public override int Priority => 3; 11 11 public override Type ConvertableType => typeof(ILookupParameter); 12 12 13 public override bool CanConvertType(Type t) => 14 t.GetInterfaces().Any(x => x == typeof(ILookupParameter)); 15 13 16 public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) => 14 17 ((ILookupParameter)item).ActualName = ((ILookupJsonItem)data).ActualName as string; -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/MultiCheckedOperatorConverter.cs
r17484 r17828 10 10 public class MultiCheckedOperatorConverter : ParameterizedItemConverter { 11 11 public override int Priority => 3; 12 12 13 public override Type ConvertableType => typeof(ICheckedMultiOperator<>); 13 14 15 public override bool CanConvertType(Type t) => 16 t.GetInterfaces().Any(x => x.IsGenericType && x.GetGenericTypeDefinition() == ConvertableType); 17 14 18 public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) { 15 19 base.Inject(item, data, root); -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ParameterizedItemConverter.cs
r17473 r17828 10 10 public override int Priority => 2; 11 11 public override Type ConvertableType => typeof(IParameterizedItem); 12 13 public override bool CanConvertType(Type t) => 14 t.GetInterfaces().Any(x => x == typeof(IParameterizedItem)); 12 15 13 16 public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) { … … 39 42 return item; 40 43 } 44 41 45 } 42 46 } -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/RegressionProblemDataConverter.cs
r17560 r17828 34 34 public override Type ConvertableType => HEAL.Attic.Mapper.StaticCache.GetType(new Guid("EE612297-B1AF-42D2-BF21-AF9A2D42791C")); 35 35 36 public override bool CanConvertType(Type t) => 37 ConvertableType.IsAssignableFrom(t); 38 36 39 public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) { 37 40 … … 180 183 if(it != null) { 181 184 if(it.MoveNext() && it.Current is double) { 182 CreateMatrix(dict, out IList<string> rowNames, out double[][] mat);185 CreateMatrix(dict, out IList<string> columnNames, out double[][] mat); 183 186 return new DoubleMatrixJsonItem() { 184 187 Name = Dataset, 185 188 Value = mat, 186 RowNames = rowNames,189 ColumnNames = columnNames, 187 190 Minimum = double.MinValue, 188 191 Maximum = double.MaxValue 189 192 }; 190 193 } else if(it.Current is int) { 191 CreateMatrix(dict, out IList<string> rowNames, out int[][] mat);194 CreateMatrix(dict, out IList<string> columnNames, out int[][] mat); 192 195 return new IntMatrixJsonItem() { 193 196 Name = Dataset, 194 197 Value = mat, 195 RowNames = rowNames,198 ColumnNames = columnNames, 196 199 Minimum = int.MinValue, 197 200 Maximum = int.MaxValue 198 201 }; 199 202 } else if (it.Current is bool) { 200 CreateMatrix(dict, out IList<string> rowNames, out bool[][] mat);203 CreateMatrix(dict, out IList<string> columnNames, out bool[][] mat); 201 204 return new BoolMatrixJsonItem() { 202 205 Name = Dataset, 203 206 Value = mat, 204 RowNames = rowNames207 ColumnNames = columnNames 205 208 }; 206 209 } … … 210 213 } 211 214 212 private void CreateMatrix<T>(Dictionary<string, IList> dict, out IList<string> rowNames, out T[][] matrix) {215 private void CreateMatrix<T>(Dictionary<string, IList> dict, out IList<string> columnNames, out T[][] matrix) { 213 216 int cols = dict.Count, rows = 0, c = 0; 214 rowNames = new List<string>();217 columnNames = new List<string>(); 215 218 matrix = new T[cols][]; 216 219 foreach (var x in dict) { 217 220 rows = Math.Max(rows, x.Value.Count); 218 rowNames.Add(x.Key);221 columnNames.Add(x.Key); 219 222 220 223 matrix[c] = new T[rows]; 224 221 225 int r = 0; 222 223 foreach (var rowValue in x.Value) { 224 matrix[c][r] = (T)rowValue; 226 foreach (var callValue in x.Value) { 227 matrix[c][r] = (T)callValue; 225 228 ++r; 226 229 } -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ResultParameterConverter.cs
r17473 r17828 12 12 13 13 public override Type ConvertableType => typeof(IResultParameter); 14 15 public override bool CanConvertType(Type t) => 16 t.GetInterfaces().Any(x => x == typeof(IResultParameter)); 14 17 15 18 public override IJsonItem Extract(IItem value, IJsonItemConverter root) { -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/StringValueConverter.cs
r17483 r17828 12 12 public override Type ConvertableType => typeof(StringValue); 13 13 14 public override bool CanConvertType(Type t) => 15 ConvertableType.IsAssignableFrom(t); 16 14 17 public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) => 15 18 ((StringValue)item).Value = ((StringJsonItem)data).Value; -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueLookupParameterConverter.cs
r17483 r17828 10 10 public override int Priority => 4; 11 11 public override Type ConvertableType => typeof(IValueLookupParameter); 12 13 public override bool CanConvertType(Type t) => 14 t.GetInterfaces().Any(x => x == typeof(IValueLookupParameter)); 12 15 13 16 public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) { -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueParameterConverter.cs
r17519 r17828 10 10 public override int Priority => 2; 11 11 public override Type ConvertableType => typeof(IValueParameter); 12 13 public override bool CanConvertType(Type t) => 14 t.GetInterfaces().Any(x => x == typeof(IValueParameter)); 12 15 13 16 public override void Inject(IItem value, IJsonItem data, IJsonItemConverter root) { -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueRangeConverter.cs
r17483 r17828 14 14 public override int Priority => 1; 15 15 public override Type ConvertableType => typeof(IntRange); 16 17 public override bool CanConvertType(Type t) => 18 ConvertableType.IsAssignableFrom(t); 16 19 17 20 public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) { … … 39 42 public override Type ConvertableType => typeof(DoubleRange); 40 43 44 public override bool CanConvertType(Type t) => 45 ConvertableType.IsAssignableFrom(t); 46 41 47 public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) { 42 48 DoubleRange range = item as DoubleRange; -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueTypeArrayConverter.cs
r17477 r17828 13 13 public override int Priority => 1; 14 14 public override Type ConvertableType => typeof(IntArray); 15 16 public override bool CanConvertType(Type t) => 17 ConvertableType.IsAssignableFrom(t); 15 18 16 19 public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) { … … 39 42 public override Type ConvertableType => typeof(DoubleArray); 40 43 44 public override bool CanConvertType(Type t) => 45 ConvertableType.IsAssignableFrom(t); 46 41 47 public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) { 42 48 DoubleArray arr = item as DoubleArray; … … 63 69 public override int Priority => 2; 64 70 public override Type ConvertableType => typeof(PercentArray); 71 72 public override bool CanConvertType(Type t) => 73 ConvertableType.IsAssignableFrom(t); 65 74 66 75 public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) { … … 89 98 public override Type ConvertableType => typeof(BoolArray); 90 99 100 public override bool CanConvertType(Type t) => 101 ConvertableType.IsAssignableFrom(t); 102 91 103 public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) { 92 104 BoolArray arr = item as BoolArray; -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueTypeMatrixConverter.cs
r17483 r17828 12 12 public override int Priority => 1; 13 13 public override Type ConvertableType => typeof(IntMatrix); 14 14 15 public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) { 15 16 IntMatrix mat = item as IntMatrix; … … 92 93 where T : struct 93 94 { 95 public override bool CanConvertType(Type t) => 96 ConvertableType.IsAssignableFrom(t); 97 94 98 #region Helper 99 /// <summary> 100 /// Copies the data into the matrix object. Uses reflection to set the 101 /// row and column size of the matrix, because it is not possible to 102 /// create a new matrix at this point and there exists no public resize method. 103 /// </summary> 104 /// <param name="matrix"></param> 105 /// <param name="data"></param> 95 106 protected void CopyMatrixData(MatrixType matrix, T[][] data) { 96 107 var cols = data.Length; -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Converters/ValueTypeValueConverter.cs
r17483 r17828 12 12 public override int Priority => 1; 13 13 public override Type ConvertableType => typeof(IntValue); 14 15 public override bool CanConvertType(Type t) => 16 ConvertableType.IsAssignableFrom(t); 14 17 15 18 public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) => … … 30 33 public override Type ConvertableType => typeof(DoubleValue); 31 34 35 public override bool CanConvertType(Type t) => 36 ConvertableType.IsAssignableFrom(t); 37 32 38 public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) => 33 39 ((DoubleValue)item).Value = ((DoubleJsonItem)data).Value; … … 46 52 public override int Priority => 2; 47 53 public override Type ConvertableType => typeof(PercentValue); 54 55 public override bool CanConvertType(Type t) => 56 ConvertableType.IsAssignableFrom(t); 48 57 49 58 public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) => … … 64 73 public override Type ConvertableType => typeof(BoolValue); 65 74 75 public override bool CanConvertType(Type t) => 76 ConvertableType.IsAssignableFrom(t); 77 66 78 public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) => 67 79 ((BoolValue)item).Value = ((BoolJsonItem)data).Value; … … 79 91 public override Type ConvertableType => typeof(DateTimeValue); 80 92 93 public override bool CanConvertType(Type t) => 94 ConvertableType.IsAssignableFrom(t); 95 81 96 public override void Inject(IItem item, IJsonItem data, IJsonItemConverter root) => 82 97 ((DateTimeValue)item).Value = ((DateTimeJsonItem)data).Value; -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Interfaces/IConcreteRestrictedJsonItem.cs
r17519 r17828 1 using System.Collections.Generic; 1 using System.Collections; 2 using System.Collections.Generic; 2 3 3 4 namespace HeuristicLab.JsonInterface { 4 5 public interface IConcreteRestrictedJsonItem<T> : IJsonItem { 5 6 /// <summary> 6 /// The item,7 /// array of restricted items 7 8 /// </summary> 8 9 IEnumerable<T> ConcreteRestrictedItems { get; set; } -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Interfaces/IJsonItemConverter.cs
r17519 r17828 29 29 /// </summary> 30 30 int Priority { get; } 31 32 /// <summary> 33 /// Checks if the given type can be converted. 34 /// </summary> 35 /// <param name="t"></param> 36 /// <returns></returns> 37 bool CanConvertType(Type t); 31 38 } 32 39 } -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonItemConverter.cs
r17540 r17828 22 22 23 23 public Type ConvertableType => throw new NotImplementedException(); 24 25 public bool CanConvertType(Type t) => throw new NotImplementedException(); 24 26 #endregion 25 27 … … 32 34 IList<IJsonItemConverter> possibleConverters = new List<IJsonItemConverter>(); 33 35 34 foreach (var x in Converters) 35 if ( CompareTypes(type, x.Key))36 foreach (var x in Converters) { 37 if (x.Value.CanConvertType(type)) 36 38 possibleConverters.Add(x.Value); 39 } 40 37 41 38 42 if(possibleConverters.Count > 0) { … … 61 65 else { 62 66 IJsonItemConverter converter = GetConverter(item.GetType()); 63 if (converter == null) return new UnsupportedJsonItem(); 67 if (converter == null) 68 return new UnsupportedJsonItem() { Name = $"{item.ItemName} (unsupported)" }; 64 69 IJsonItem tmp = converter.Extract(item, root); 65 70 ExtractCache.Add(hash, tmp); … … 84 89 Converters = converters; 85 90 } 86 87 private bool CompareGenericTypes(Type t1, Type t2) =>88 (t1.IsGenericType && t1.GetGenericTypeDefinition() == t2) /*||89 (t2.IsGenericType && t2.GetGenericTypeDefinition() == t1)*/;90 91 private bool CompareTypes(Type t1, Type t2) =>92 t1 == t2 || /*t1.IsAssignableFrom(t2) ||*/93 t1.GetInterfaces().Any(94 i => i == t2 || CompareGenericTypes(i, t2)95 ) ||96 CompareGenericTypes(t1, t2);97 91 } 98 92 } -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonTemplateGenerator.cs
r17689 r17828 12 12 public class JsonTemplateGenerator { 13 13 14 public static void GenerateTemplate(string path, IOptimizer optimizer) => 15 GenerateTemplate(path, optimizer.Name, optimizer); 14 /// <summary> 15 /// static Function to generate a template. 16 /// </summary> 17 /// <param name="templatePath">the path for the template files</param> 18 /// <param name="optimizer">the optimizer object to serialize</param> 19 /// <param name="rootItem">Root JsonItem for serialization, considers only active JsonItems for serialization</param> 20 public static void GenerateTemplate(string templatePath, IOptimizer optimizer, IJsonItem rootItem) { 21 // clear all runs 22 optimizer.Runs.Clear(); 16 23 17 public static void GenerateTemplate(string path, string templateName, IOptimizer optimizer) => 18 GenerateTemplate(path, templateName, optimizer, JsonItemConverter.Extract(optimizer)); 24 // validation 25 ValidationResult validationResult = rootItem.GetValidator().Validate(); 26 if (!validationResult.Success) 27 throw validationResult.GenerateException(); 19 28 20 public static void GenerateTemplate(string path, string templateName, IOptimizer optimizer, IJsonItem rootItem) {21 29 #region Init 22 30 JObject template = JObject.Parse(Constants.Template); … … 24 32 JArray resultItems = new JArray(); 25 33 IList<IJsonItem> jsonItems = new List<IJsonItem>(); 26 string fullPath = Path.GetFullPath(path); 34 string templateName = Path.GetFileName(templatePath); 35 string templateDirectory = Path.GetDirectoryName(templatePath); 36 27 37 #endregion 28 38 … … 35 45 #region Serialize HL File 36 46 ProtoBufSerializer serializer = new ProtoBufSerializer(); 37 string hlFilePath = Path.Combine( fullPath, templateName + ".hl");47 string hlFilePath = Path.Combine(templateDirectory, $"{templateName}.hl"); 38 48 serializer.Serialize(optimizer, hlFilePath); 39 49 #endregion … … 56 66 57 67 #region Serialize and write to file 58 File.WriteAllText( fullPath + @"\" + templateName + ".json", SingleLineArrayJsonWriter.Serialize(template));68 File.WriteAllText(Path.Combine(templateDirectory, $"{templateName}.json"), SingleLineArrayJsonWriter.Serialize(template)); 59 69 #endregion 60 70 } -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/JsonTemplateInstantiator.cs
r17560 r17828 1 using System.Collections.Generic; 1 using System; 2 using System.Collections.Generic; 2 3 using System.IO; 3 4 using System.Linq; … … 66 67 IJsonItem rootItem = Objects.First().Value; 67 68 68 //TODO validate 69 // validation 70 ValidationResult validationResult = rootItem.GetValidator().Validate(); 71 if (!validationResult.Success) 72 throw validationResult.GenerateException(); 69 73 70 74 // inject configuration … … 105 109 if (Objects.TryGetValue(path, out IJsonItem param)) { 106 110 // remove fixed template parameter from config => dont allow to copy them from concrete config 111 // TODO: shift this into JsonItems? 107 112 obj.Property(nameof(IIntervalRestrictedJsonItem<int>.Minimum))?.Remove(); 108 113 obj.Property(nameof(IIntervalRestrictedJsonItem<int>.Maximum))?.Remove(); 109 114 obj.Property(nameof(IConcreteRestrictedJsonItem<string>.ConcreteRestrictedItems))?.Remove(); 115 obj.Property(nameof(IMatrixJsonItem.ColumnsResizable))?.Remove(); 116 obj.Property(nameof(IMatrixJsonItem.RowsResizable))?.Remove(); 117 obj.Property(nameof(IArrayJsonItem.Resizable))?.Remove(); 110 118 // merge 111 119 param.SetJObject(obj); -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/ConcreteRestrictedValueJsonItem.cs
r17519 r17828 1 using System.Collections.Generic; 1 using System.Collections; 2 using System.Collections.Generic; 2 3 using System.Linq; 3 4 4 5 namespace HeuristicLab.JsonInterface { 6 5 7 public abstract class ConcreteRestrictedValueJsonItem<T> : ValueJsonItem<T>, IConcreteRestrictedJsonItem<T> { 8 6 9 public IEnumerable<T> ConcreteRestrictedItems { get; set; } 7 10 -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/IntervalRestrictedValueJsonItem.cs
r17519 r17828 20 20 if (minProp != null) Minimum = minProp.ToObject<T>(); 21 21 22 23 22 var maxProp = jObject[nameof(IIntervalRestrictedJsonItem<T>.Maximum)]; 24 23 if (maxProp != null) Maximum = maxProp.ToObject<T>(); -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/JsonItem.cs
r17519 r17828 1 using System.Collections; 1 using System; 2 using System.Collections; 2 3 using System.Collections.Generic; 3 4 using System.Linq; … … 26 27 public bool Success { get; } 27 28 public IEnumerable<string> Errors { get; } 29 30 public Exception GenerateException() => 31 new AggregateException(Errors.Select(x => new ArgumentException(x))); 28 32 } 29 33 … … 76 80 } 77 81 78 // TODO jsonIgnore dataType?79 82 [JsonIgnore] 80 83 public virtual IEnumerable<IJsonItem> Children { get; protected set; } -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/ResultJsonItem.cs
r17519 r17828 2 2 public class ResultJsonItem : JsonItem, IResultJsonItem { 3 3 protected override ValidationResult Validate() => ValidationResult.Successful(); 4 5 public string Converter { get; set; } 4 6 } 5 7 } -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.JsonInterface/Models/UnsupportedJsonItem.cs
r17519 r17828 1 1 using System; 2 2 using System.Collections.Generic; 3 using System.Linq; 3 4 using Newtonsoft.Json; 4 5 5 6 namespace HeuristicLab.JsonInterface { 6 7 public class UnsupportedJsonItem : JsonItem { 8 /* 7 9 public override string Name { 8 10 get => throw new NotSupportedException(); … … 10 12 } 11 13 12 public override string Description { 14 public override string Description { // TODO 13 15 get => throw new NotSupportedException(); 14 16 set => throw new NotSupportedException(); … … 18 20 get => throw new NotSupportedException(); 19 21 } 22 */ 20 23 21 24 [JsonIgnore] 22 25 public override IEnumerable<IJsonItem> Children { 23 get => throw new NotSupportedException();26 get => Enumerable.Empty<IJsonItem>(); 24 27 protected set => throw new NotSupportedException(); 25 28 } 26 29 /* 27 30 [JsonIgnore] 28 31 public override IJsonItem Parent { … … 30 33 set => throw new NotSupportedException(); 31 34 } 32 35 */ 33 36 protected override ValidationResult Validate() => ValidationResult.Successful(); 34 37 }
Note: See TracChangeset
for help on using the changeset viewer.