1

MSDNの別のスレッドで見つけたコードを使用して、独自のIListサブクラスを作成することができました。独自のメソッドをいくつか追加し、基本的なシナリオでクラスをテストしましたが、正常に機能しているようです。

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

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

public class pList<T> : IList<T>

ジェームズ

4

5 に答える 5

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();
于 2012-04-18T18:33:02.253 に答える
4

List<T>に直接キャストすることはできませんpList<T>。拡張メソッドを作成できます(のようにToList)。IEnumerable<T>クラスに、リストにデータを入力するためのコンストラクターがあると仮定します。

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

クラスにそのようなコンストラクターがない場合は、コンストラクターを追加するか、次のようにすることができます。

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()が表示されません。何かが足りませんか?

まず、そのようなコンストラクターがあり、既存のList<T>ものをに変換したいpList<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
    {
        ...
于 2012-04-18T18:31:06.000 に答える
2

暗黙のキャストを定義することもできます。

public static implicit operator pList<T>(List<T> other)
{
     //Code returning a pList
}
于 2012-04-18T18:32:53.807 に答える
2

新しいリストタイプを返す拡張メソッドを作成する必要があります

public static List<TSource> ToMyList<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
    {
        throw ArgumentNullException("source");
    }
    return new pList<TSource>(source);
}
于 2012-04-18T18:33:20.817 に答える
1

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

// assume you're working with IList<string> instance = new pList<string>()
pList<string> castedBack = (pList<string>)instance;
于 2012-04-18T18:31:22.667 に答える