如何传递参数来声明泛型类型列表?

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);
            }
        }
    }

这是我的代码。我试图将类型参数传递给私有方法以声明通用类型列表...但我不知道该怎么做。
参数接收器是一个列表。在这种情况下,接收器存储了一个对象的通用类型。 参数类型是通用类型的类型。
我已经在互联网上搜索了一段时间。我仍然不确定如何做到这一点。

2
我无法理解你在这里尝试做什么。你能写一份说明,解释你实际想要实现什么吗?你是想复制一个列表吗? - nicodemus13
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 而不是 ref(就像我做的一样),因为你在返回之前总是会给 taker 赋值。这样可以让调用代码在调用你的方法之前不必赋值一个虚拟值。
或者更好的方法是,你应该直接返回列表
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;
}

实际上,深入阅读您的问题后,似乎您想要实例化某种类型的新对象,并将其value属性设置为giver中的项。那么这个怎么样(当然,我假设了很多关于您的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;
}

2
最好放弃listSize,转而使用giver.Count。 - H H
@HenkHolterman 同意,但我想知道 listSize 是否还有其他我们不知道的问题。 - lc.

2
我猜这是某种类似于:的东西:
private void ListHelper<T>(int listSize, ref object taker, object giver)
{
    ...
    List<T> list = new List<T>();
    ...
}

1
你应该创建一个通用方法。在C#中,泛型充当模板。该方法在声明时绑定。
public void ListHelper<T>//...

    List<T>  my list//...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接