【问题标题】:How to pass a parameter to declare generic type list?如何传递参数来声明泛型类型列表?
【发布时间】:2012-10-17 00:19:14
【问题描述】:
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);
            }
        }
    }

这是我的代码。我试图将类型参数传递给私有方法来声明泛型类型列表......但我不知道该怎么做。

参数接受器是一个列表。在这种情况下,接受者正在存储一个通用类型的对象。 参数类型是泛型的类型。

我已经在互联网上搜索了一段时间。我仍然不确定如何执行此操作。

【问题讨论】:

  • 我无法理解您在此处尝试执行的操作。你能写下你想要实现的目标的解释吗?您要复制列表吗?

标签: c# list generics types


【解决方案1】:

尝试改用泛型方法:

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 而不是ref(就像我所做的那样),因为您总是在返回之前为taker 分配一个值。这允许调用代码在调用您的方法之前不必分配一个虚拟值。

或者更好的是,您应该返回列表

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

注意,如果你的方法只是将所有元素从giver复制到taker(也就是说,指定listSize实际上只是编码C的一种保留习惯,并且总是等于@987654329中的元素数量@),您可以替换 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;
}

事实上,进一步阅读您的问题,您似乎想要实例化某种类型的新对象并将 它的value 属性设置为giver 中的项目。那么这个怎么样(当然,我假设很多关于您的taker 对象,并且您有一个接口ITaker&lt;U&gt;,它指定了一个字段/属性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;
}

【讨论】:

  • 最好放弃 listSize 以支持 giver.Count
  • @HenkHolterman 同意,但我想知道 listSize 是否还有其他我们不知道的事情
  • 非常感谢!很有帮助!
【解决方案2】:

我猜是这样的:

private void ListHelper<T>(int listSize, ref object taker, object giver)
{
    ...
    List<T> list = new List<T>();
    ...
}

【讨论】:

    【解决方案3】:

    您应该创建一个通用方法。泛型在 C# 中充当模板。该方法在声明时被绑定。

    public void ListHelper<T>//...
    
        List<T>  my list//...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      • 1970-01-01
      • 2011-07-21
      • 1970-01-01
      • 2019-02-27
      相关资源
      最近更新 更多