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;}
}

アプリの実行中に、上記と同じ構造を持つオブジェクトを含むデータ パケットを受信し、これら 2 つのオブジェクトのプロパティを結合する必要があります。次の関数では、次のように、受信コレクションの各アイテムをベース オブジェクトに追加する方法に関する一連の特定のルールがあります。

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;
            }
        }
    }

すべてのコレクション アイテムは、Action プロパティと Index プロパティがあることを保証する IViperEvent インターフェイスを実装します。どちらのコレクションにも同じタイプのアイテムが含まれます。異なるコレクションのそれぞれをマージするためのロジックはまったく同じですが、たとえば ObservableCollection を ICollection にキャストすることはできません。これが許可されない理由は理解できますが、IViperEvent インターフェイスを実装するすべてのコレクションに対してこの関数を使用する方法はありますか? 方法がなければなりません。PersonnelList、FluidList、EquipmentList などを 1 行だけ変更して、この同じ関数をコピー アンド ペーストするのは嫌いです。

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 に答える