using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace WeldingCommon.Utils.Diff { public static class CompareHelper { public sealed class FieldSpec { public string Name { get; } public Func Getter { get; } public Func Formatter { get; } public FieldSpec(string name, Func getter, Func formatter = null) { Name = name; Getter = getter; Formatter = formatter; } } /// /// 지정한 항목만 비교해서, 달라진 것만 diffs에 쌓음 /// public static void Fill(T oldObj, T newObj, ObservableCollection diffs, params FieldSpec[] fields) { if (oldObj == null) throw new ArgumentNullException(nameof(oldObj)); if (newObj == null) throw new ArgumentNullException(nameof(newObj)); if (diffs == null) throw new ArgumentNullException(nameof(diffs)); if (fields == null) throw new ArgumentNullException(nameof(fields)); diffs.Clear(); for (int i = 0; i < fields.Length; i++) { var f = fields[i]; var oldVal = f.Getter(oldObj); var newVal = f.Getter(newObj); if (!Equals(oldVal, newVal)) diffs.Add(new PropertyDiff(f.Name, oldVal, newVal, f.Formatter)); } } /* 단위 테스트 자료 //Compare 추가 var diffs = new ObservableCollection(); CompareHelper.Fill(RecipeBeforeChangedStageA, RecipeStageA, diffs, new CompareHelper.FieldSpec(nameof(MainRecipe.N2PressMFC), x => x.N2PressMFC), new CompareHelper.FieldSpec(nameof(MainRecipe.AxisZPosition), x => x.AxisZPosition), new CompareHelper.FieldSpec(nameof(MainRecipe.StraightParam.Velocity), x => x.StraightParam.Velocity), new CompareHelper.FieldSpec(nameof(MainRecipe.CurveParam.Velocity), x => x.CurveParam.Velocity), new CompareHelper.FieldSpec(nameof(MainRecipe.StraightParam.CorePowerW), x => x.StraightParam.CorePowerW), new CompareHelper.FieldSpec(nameof(MainRecipe.StraightParam.RingPowerW), x => x.StraightParam.RingPowerW), new CompareHelper.FieldSpec(nameof(MainRecipe.CurveParam.CorePowerW), x => x.CurveParam.CorePowerW), new CompareHelper.FieldSpec(nameof(MainRecipe.RampingOnStartPower), x => x.RampingOnStartPower), new CompareHelper.FieldSpec(nameof(MainRecipe.RampingOnOverlapDist), x => x.RampingOnOverlapDist), new CompareHelper.FieldSpec(nameof(MainRecipe.RampingOffEndPower), x => x.RampingOffEndPower), new CompareHelper.FieldSpec(nameof(MainRecipe.RampingOffOverlapDist), x => x.RampingOffOverlapDist) ); if(diffs.Count > 0) { Log.FuncI("Recipe Parameter Changed"); foreach (var diff in diffs) Log.V($"{diff.ToString()}"); } */ } }