3
private void listHelper (int listSize, ref Object taker, Object giver, Type type)
    {
        if (listSize == 0)
        {
            taker = null;
        }
        else
        {
            taker = new List<type>(listSize);
            giverType tempGiver;
            for (int i = 0; i < listSize; i++)
            {
                type= new type();
                tempGiver.value = giver[i];
                taker.Add(tempGiver);
            }
        }
    }

これは私のコードです。型パラメーターをプライベート メソッドに渡してジェネリック型リストを宣言しようとしましたが、どうすればよいかわかりません。

パラメータ テイカーはリストです。この場合、テイカーはジェネリック型のオブジェクトを格納しています。パラメーターの型は、ジェネリックの型です。

私はこれについてしばらくの間インターネットで検索しました。これを行う方法はまだわかりません。

4

3 に答える 3

10

代わりにジェネリック メソッドを作成してみてください。

private void listHelper<T> (int listSize, out List<T> taker, IList<T> giver)
{
    if (listSize == 0)
    {
        taker = null;
    }
    else
    {
        taker = new List<T>(listSize);
        for (int i = 0; i < listSize; i++)
        {
            taker.Add(giver[i]);
        }
    }
}

また、戻る前に常に値を割り当てるため、(私が行ったように)outではなく使用することをお勧めします。これにより、呼び出し元のコードは、メソッドを呼び出す前にダミーの値を割り当てる必要がなくなります。reftaker

またはさらに良いことに、 List を返すだけです!

private List<T> listHelper<T> (int listSize, IList<T> giver)
{
    List<T> taker;
    ...
    return taker;
}

メソッドがすべての要素を からgiverにコピーすることだけを行っている場合taker(つまり、 を指定することlistSizeは、実際には C のコーディングからの持ち越し習慣であり、常に の要素の数に等しいgiver)、代用するgiver.Countか、単に行うことができます。

private List<T> listHelper<T> (IList<T> giver)
{
    return giver.Any() ? giver.ToList() : null;
}

もちろん、listSize本当に「返す要素の数」の先頭から始まるgiver場合は、次のことができます。

private List<T> listHelper<T> (IList<T> giver, int numElements)
{
    return giver.Any() ? giver.Take(numElements).ToList() : null;
}

実際、あなたの質問をさらに読むと、何らかのタイプの新しいオブジェクトをインスタンス化し、そのプロパティを のアイテムに設定valuegiverたいようです。では、これはどうですか(もちろん、オブジェクトについて多くのことを想定しており、フィールド/プロパティを指定takerするインターフェースがあると想定しています):ITaker<U>public U value

private List<T<U>> listHelper<T, U> (IList<U> giver) where T : ITaker<U>, new()
{
    return giver.Any() ? giver.Select(g => new T<U>() {value = g}).ToList() : null;
}
于 2012-10-26T17:54:56.887 に答える
2

次のようなものだと思います:

private void ListHelper<T>(int listSize, ref object taker, object giver)
{
    ...
    List<T> list = new List<T>();
    ...
}
于 2012-10-26T17:55:50.053 に答える
1

Generic メソッドを作成する必要があります。ジェネリックは C# のテンプレートとして機能します。メソッドは宣言時にバインドされます。

public void ListHelper<T>//...

    List<T>  my list//...
于 2012-10-26T17:54:52.090 に答える