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 参数将单个对象从列表中取出。我可以假设如果索引不为空,那么它们会传入一个列表,但是我如何获得该值?我不能这样做:

object temp = something[index.Value];

需要注意的是,我不能强制用户将单个对象传递给我的通用方法。此外,我不能将其设为数组(T[])并强制用户传入数组(或列表)。

4

5 回答 5

6

您可以使用强制转换来获取IList.

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

IList然而,使用一个专用的泛型方法重载而不是一个庞大的泛型方法可能更简单,类型更安全。

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

如果您的代码不关心具体类型,则应使用泛型。如果您仍想这样做,则需要强制转换:

IList list = (IList)something;

或者,如果它是一个通用列表,如果您不知道元素类型,则您需要进行反射访问以在运行时调用列表索引器。

这个(低效的)代码段也可能对您有所帮助:

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

这些都是一些丑陋的伎俩。没有干净的方法,因为您再次稍微滥用了该功能。

此外,您根本不需要泛型。只需将参数键入为object.

于 2013-07-10T15:27:06.077 回答
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 回答