2012-04-18 11 views
1

MSDNの別のスレッドで見つかったコードを使用して自分のIListサブクラスを作成できました。私は自分のメソッドをいくつか追加して、基本的なシナリオでクラスをテストしました。うまくいくようです。リストから<T>のサブタイプに変換するには<T>

問題は、通常の.ToList()メソッドを試してみると、私のカスタムpListの代わりにListが返されることです。明らかに私は新しいタイプにキャストする必要がありますが、私はどのようにわかりません。カスタムのiListに別のメソッドを実装して、別の形式で割り当てることができるようにする必要がありますか?

私のクラスは以下のように宣言されています。

public class pList<T> : IList<T> 

ジェームズ

答えて

4

あなたはpList<T>に直接List<T>をキャストすることはできません。あなたは拡張メソッドを作ることができます(ちょうどToListのように)。あなたのクラスと仮定すると、リストを移入するIEnumerable<T>を取るコンストラクタがあります。

static class EnumerableExtensions 
{ 
    static pList<T> ToPList<T>(this IEnumerable<T> sequence) { return new pList<T>(sequence); } 
} 

あなたのクラスは、コンストラクタを持っていない場合は、1を追加したり、このような何かを行うことができ、次のいずれか

static class EnumerableExtensions 
{ 
    static pList<T> ToPList<T>(this IEnumerable<T> sequence) 
    { 
     var result = new pList<T>(); 
     foreach (var item in sequence) 
      result.Add(item); 
     return result; 
    } 
} 

私のpListクラスは、IEnumerableがあなたの拡張メソッドを追加したコンストラクタを持っていますが、まだリスト内のToPList()を見ることができません。あなたは、このようなコンストラクタを持っている、とあなたはpList<T>に既存のList<T>を変換したい場合、あなたはもちろん、これを行うことができます

まず、:拡張メソッドを使用するには

List<T> originalList = GetTheListSomehow(); 
var newList = new pList<T>(originalList); 

を、あなたがする必要はありメソッドが有効範囲内にあることを確認してください。私は私の例にアクセス修飾子を追加しませんでした。必要に応じて、中internalまたはpublicを置く:

public static class EnumerableExtensions 
{ 
    internal static pList<T> ToPList<T> //... 

また、あなたは別の名前空間に拡張メソッドを使用したい場合は、あなたがスコープでusingディレクティブを持っている必要があります。他の場所

namespace A { public static class EnumerableExtensions { ... 

:例えば

using A; 
// here you can use the extension method 

namespace B 
{ 
    public class C 
    { 
     ... 

又は

namespace B 
{ 
    using A; 
    // here you can use the extension method 

    public class C 
    { 
     ... 
+0

こんにちは、私のPLISTクラスは IEnumerableをあなたの拡張メソッドを追加したが、私は内、まだほん()を参照することができません取るコンストラクタを持っていますリスト何か不足していますか? –

+0

@JarmezDeLaRocha "List ' "の中ではどういう意味ですか?インテリセンスの意味ですか? – phoog

+0

そうだね、リストをするとき。私はtolistやtoarrayを見ているようにtoplistの例は見ません。私はポイントを逃していますか?私はちょうどこれらの拡張メソッドでsoemの読書をしています今は私に新しいです! –

1

IList<T>インタフェースです。クラスではありません。あなたがIList<T>のインスタンスとしてクラスを処理している場合は、単に、むしろToList()を呼び出すよりも、バックキャストすることができます:

2

またimplicitキャストを定義することができます。

public static implicit operator pList<T>(List<T> other) 
{ 
    //Code returning a pList 
} 
4

私はあなたが達成しようとしているかを正確にわからないんだけど、おそらくあなたは、次のコードを追加することができます:拡張メソッドを次に

// Constructor which handles enumerations of items 
public pList(IEnumerable<T> items) 
{ 
    // this.innerCollection = new Something(items); 
} 

を:

public static class pListExtensions 
{ 
    public static pList<T> ToPList<T>(this IEnumerable<T> items) 
    { 
     return new pList<T>(items); 
    } 
} 

後であなたのコードで使用します:

var items = (from t in db.Table 
      where condition(t) 
      select new { Foo = bar(t), Frob = t.ToString() }).ToPList(); 
2

はあなたの新しいリスト型を返す拡張メソッドを作成する必要があり

public static List<TSource> ToMyList<TSource>(this IEnumerable<TSource> source) 
{ 
    if (source == null) 
    { 
     throw ArgumentNullException("source"); 
    } 
    return new pList<TSource>(source); 
}