1

ジェネリック メソッドがあり、渡されたオブジェクトが単一のオブジェクトまたはオブジェクトのリストである可能性があります。例:

public void MyGenericMethod<T>(T something, int? index)
{
    // if it is a list how do I get to the object in the list?
}

誰かがリストを渡す場合があります。オブジェクトのリストが渡された場合は、index パラメータを使用して、リストから単一のオブジェクトを取得します。index が null でない場合、リストを渡したと推測できますが、その値を取得するにはどうすればよいでしょうか? 私はこれを行うことはできません:

object temp = something[index.Value];

ユーザーに 1 つのオブジェクトをジェネリック メソッドに渡すように強制することはできないことに注意してください。また、配列(T [])にして、ユーザーに配列(またはリスト)を渡すように強制することもできません。

4

5 に答える 5

6

キャストを使用して を取得できますIList

IList list = something as IList;
if( list != null )
{
    object temp = list[index.Value];
}

IListただし、1 つの大規模なジェネリック メソッドの代わりに専用のジェネリック メソッド オーバーロードを使用する方が、より単純でタイプ セーフである可能性があります。

public void MyGenericMethod<T>(IList<T> something, int index)
{
    var item = something[index];
    // etc...
}
于 2013-07-10T15:30:28.440 に答える
1

あなたの要件は少し奇妙に思えます...次のことをしてみませんか:

public void MyGenericMethod<T>(T something)
{
    // let the user pass in the correct item
}

そして、単にユーザーに処理させてください。結局のところ、方法は次のとおりです。

MyGenericMethod(MyList, 1);

以下よりも大幅に優れています。

MyGenericMethod(MyList[1])

???

あなたが本当に望むなら、私はそれを次のように書きます:

public void MyGenericMethod<T>(T something) //Base Method
{
    // let the user pass in the correct item
}

public void MyGenericMethod<IList<T>>(IList<T> list, int index)  //Overload
{
    MyGenericMethod(list[index]);
}
于 2013-07-10T15:31:18.640 に答える
0

usr が言ったように、ジェネリックは実際にはこのように使用されることは想定されていません。

それがリストであるかどうかを確認し、そうである場合は次のように繰り返します。

IList<T> enumerable = something as IList<T>;
if (enumerable != null)
{
    foreach (T item in enumerable)
    {
        // Do something
    }
}
于 2013-07-10T15:31:02.243 に答える
0

T が何でもかまいません (これはSOLIDの原則に違反しているため、お勧めしません)、それをリストとして処理する方法は次のとおりです。

public void MyGenericMethod<T>(T something, int? index)
{
   IList list = something as IList;
   if (list != null)
   {
      //Do Something
   }
   else
   {
      //Do something else
   }
}

または、次のいずれかを実行できます。

public void MyGenericMethod<T>(T something, int? index) where T : IList
{
   IList list = (IList)something; //This will always work ok
   //Do Something
}

可能であれば、以下をお勧めします

public void MyGenericMethod(IList something, int? index)
{
     //Do Something
}
于 2013-07-10T15:36:12.320 に答える
0

ジェネリックは、コードが具象型を気にしない場合に使用することを意図しています。それでもこれを行いたい場合は、キャストする必要があります:

IList list = (IList)something;

または、ジェネリック リストの場合、要素の型が静的に認識されていない場合は、リフレクション アクセスを実行してリスト インデクサーを実行時に呼び出す必要があります。

この (非効率的な) スニペットも役立つかもしれません:

List<object> list = ((IEnumerable)something).Cast<object>().ToList();

これらはいくつかの醜いトリックです。繰り返しますが、機能を少し誤用しているため、クリーンな方法はありません。

また、ジェネリックはまったく必要ありません。パラメータを として入力するだけobjectです。

于 2013-07-10T15:27:06.077 に答える