簡體   English   中英

C#中與ICollection的協方差

[英]Covariance with ICollection in C#

不是最偉大的頭銜,而是必須有一種更好的方式來實現我想要的目標。 也許答案是我雖然想錯東西...

所以我有一個具有以下結構的對象:

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等的一行更改來復制和粘貼相同的功能。

我認為這是您要尋找的:

private void ProcessEventCollection<T>(ICollection<T> existing, IEnumerable<T> newlist)
    where T : IViperEvent

有什么方法可以對實現IViperEvent接口的所有集合使用此功能?

當然:

private void ProcessEventCollection<T>(ICollection<T> existing, IEnumerable<IViperEvent> newlist)
    where T: IViperEvent 
{
    // ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM