次のように定義されたカスタムコレクションタイプがあります。
public abstract class RigCollectionBase<T> : Collection<T>, IEnumerable<T>, INotifyPropertyChanged, IBindingList, ICancelAddNew where T : BusinessObjectBase, new()
注: これは基本クラスです。次のように実装された 20 ほどの子クラスがあります。
public class MyCollection : RigCollectionBase<MyObject>
私たちのコードでは多くの Linq を使用しており、おそらくご存じのとおり、Linq 関数は を返しIEnumerable<T>
ます。私が探しているのは、MyCollection
fromに戻る簡単で簡単な方法IEumberable<MyObject>
です。キャストは許可されていません。「... からキャストできません」という例外が発生します。
これが私が思いついた答えです。うまくいきますが、ちょっとぎこちなく、複雑すぎるようです。そうではないかもしれませんが、もっと良い方法があるかどうかを確認するために、これを公開することにしました。
public static class Extension
{
/// <summary>
/// Turn your IEnumerable into a RigCollection
/// </summary>
/// <typeparam name="T">The Collection type</typeparam>
/// <typeparam name="U">The Type of the object in the collection</typeparam>
/// <param name="col"></param>
/// <returns></returns>
public static T MakeRigCollection<T, U> (this IEnumerable<U> col) where T : RigCollectionBase<U>, new() where U : BusinessObjectBase, new()
{
T retCol = new T();
foreach (U myObj in col)
retCol.Add(myObj);
return retCol;
}
}
私が本当に探しているのは、これだと思います。単純なキャストを使用して IEnumerable から MyCollection に移動できるように、基本クラスを実装する方法はありますか?
var LinqResult = oldCol.Where(a=> someCondition);
MyCollection newCol = (MyCollection)LinqResult;
いいえ、上記のコードは機能しません。実際、その理由は 100% わかりませんが、機能しません。私が見ていない非常に明白なステップがあるように感じます....