0

不是最伟大的头衔,但必须有更好的方法来完成我想要的。也许答案是我想要错误的东西......

所以我有一个具有以下结构的对象:

public class Viper
{
   public ObservableCollection<Personnel> PersonnelList {get;set;}
   public ObservableCollection<Equipment> EquipmentList {get;set;}
   public ObservableCollection<Fluid> FluidList {get;set;}
   public ObservableCollection<Event> EventList {get;set;}
}

在我的应用程序运行期间,我将收到包含与上述结构相同的对象的数据包,我需要将这两个对象的属性合并在一起。关于如何将传入集合的每个项目添加到基础对象中有一组特定的规则,如下面的函数中所示:

private void ProcessEventCollection<T>(T existing, IEnumerable<IViperEvent> newlist)
    {
        if (newlist == null) { return; }

        var a = existing.GetType();
        var b = newlist.GetType();
        if (a.GetGenericArguments().Single() != b.GetGenericArguments().Single()) { return; }

        var oldlist = (ICollection<IViperEvent>)existing;

        foreach (var evt in newlist)
        {
            switch (evt.Action.ToUpper())
            {
                case "A":
                    oldlist.Add(evt);
                    break;
                case "M":
                    var item = oldlist.FirstOrDefault(e => e.Index == evt.Index);
                    if (item != null)
                    {
                        oldlist.Remove(item);
                    }
                    oldlist.Add(evt);
                    break;
                case "D":
                    var itemToDelete = oldlist.FirstOrDefault(e => e.Index == evt.Index);
                    oldlist.Remove(itemToDelete);
                    break;
            }
        }
    }

所有集合项都实现了 IViperEvent 接口,该接口确保存在 Action 属性和 Index 属性。两个集合都将包含相同类型的项目。合并每个不同集合的逻辑完全相同,但是,例如,我不能将 ObservableCollection 转换为 ICollection。我理解为什么不允许这样做,但有什么办法可以将此函数用于实现 IViperEvent 接口的所有集合?必须有办法。我只是讨厌通过更改 PersonnelList、FluidList、EquipmentList 等的单行来复制和粘贴相同的功能。

4

2 回答 2

2

我想这就是你要找的:

private void ProcessEventCollection<T>(ICollection<T> existing, IEnumerable<T> newlist)
    where T : IViperEvent
于 2013-02-01T19:39:45.663 回答
1

有什么办法可以将此函数用于实现 IViperEvent 接口的所有集合?

当然:

private void ProcessEventCollection<T>(ICollection<T> existing, IEnumerable<IViperEvent> newlist)
    where T: IViperEvent 
{
    // ...
}
于 2013-02-01T19:39:02.097 回答