如何传入多个属性作为参数,然后正确使用它们

本文关键字:然后 参数 何传入 属性 | 更新日期: 2023-09-27 18:05:26

我得到了这个泛型方法;

public CompareResult<T> GenericCompare<T>(CompareLogic compareLogic, List<T> OldObject, List<T> NewObject, Func<T, int> DelProperty)
{
    var result = new CompareResult<T>();
    var OldObjectId = OldObject.Select(DelProperty);
    var NewObjectId = NewObject.Select(DelProperty);
    var ObjectAddedId = NewObjectId.Except(OldObjectId);
    var ObjectRemovedId = OldObjectId.Except(NewObjectId);
    var SameOldObject = OldObject.Where(x => !ObjectRemovedId.Contains(DelProperty(x)));
    var SameNewObject = NewObject.Where(x => !ObjectAddedId.Contains(DelProperty(x)));
    var SameObject = SameOldObject.Join(
                                            SameNewObject,
                                            Older => DelProperty(Older),
                                            Newer => DelProperty(Newer),
                                            (Older, Newer) => new { older = Older, newer = Newer }
                                        );
    foreach (var same in SameObject)
    {
        var ObjectCompare = compareLogic.Compare(same.older, same.newer);
        if (!ObjectCompare.AreEqual)
        {
            var Modified = ObjectCompare.Differences.Select(x => x.PropertyName);
            result.ObjectModified.Add(new Tuple<T, T, IEnumerable<string>>(same.older, same.newer, Modified));
        }
    }
    result.ObjectRemoved = OldObject.Where(x => ObjectRemovedId.Contains(DelProperty(x))).ToList();
    result.ObjectAdded = NewObject.Where(x => ObjectAddedId.Contains(DelProperty(x))).ToList();
    return result;
}

对于DelProperty参数,我可以有这些组合;

  1. 一个字段,int(当前代码)
  2. 两个字段,int, int
  3. 两个字段,字符串,字符串

参数DelProperty就像对象的主键,我需要做些什么才能使这段代码与"复合"主键兼容?我在这一点上有点卡住了。

我唯一能想到的就是复制/粘贴这段代码两次来实现两个缺失的组合但我担心会出现更多的组合这很容易变得混乱

如何传入多个属性作为参数,然后正确使用它们

您可以在键类型和键相等比较器中添加重载泛型:

public CompareResult<T> GenericCompare<T, K>(CompareLogic compareLogic, List<T> OldObject, List<T> NewObject, Func<T, K> DelProperty, IEqualityComparer<K> keyComparer)
{
    var ObjectAddedId = NewObjectId.Except(OldObjectId, keyComparer);
    var ObjectRemovedId = OldObjectId.Except(NewObjectId, keyComparer);
    ...
}

,那么你可以更新你当前的方法来调用新的方法:

public CompareResult<T> GenericCompare<T>(CompareLogic compareLogic, List<T> OldObject, List<T> NewObject, Func<T, int> DelProperty)
{
    return GenericCompare(compareLogic, OldObject, NewObject, DelProperty, EqualityComparer<int>.Default);
}