返回对通用列表的引用?

时间:2013-02-10 16:14:30

标签: c# list pass-by-reference

假设我的课程设置如下:

public abstract class GenericCustomerInformation
{
    //abstract methods declared here
}

public class Emails : GenericCustomerInformation
{
    //some new stuff, and also overriding methods from GenericCustomerInformation
}

public class PhoneNumber : GenericCustomerInformation
{
    //some new stuff, and also overriding methods from GenericCustomerInformation
}

//and more derivative classes for emails, addresses, etc ..

然后我有这个函数返回一个特定的列表:

public List<GenericCustomerInformation> GetLists<T>()
{
    if (typeof(T) == typeof(Alias))
    {
        return aliases.Cast<GenericCustomerInformation>().ToList();
    }

    if (typeof(T) == typeof(PhoneNumber))
    {
        return phoneNumbers.Cast<GenericCustomerInformation>().ToList();
    }
    // .. and the same for emails, addresses, etc ..
}

现在假设我想使用一个函数添加到这些列表中:

public void AddToList<T>(T iGenericCustomerInformation)
{
    GetLists<T>().Add((T)(object)iGenericCustomerInformation); //Doesn't work as intended. GetLists<T> seems to be returning lists as value, which is why any additions 
}

问题是AddToList<T>无法正常工作。 GetLists<T>似乎将列表作为值返回,这就是为什么我做的任何添加都没有反映在主列表结构中......

那么如何将列表作为参考返回,以便我可以使用该引用通过其他函数进行列表添加?

2 个答案:

答案 0 :(得分:1)

你已经通过所有那些typeof()if陈述来打败泛型。这根本不是通用的。我要说的只是将if语句放在AddToList()方法中并修改泛型。

public void AddToList(GenericCustomerInformation item)
{
    Alias aliasItem = item as Alias;
    if(aliasItem != null)
    {
        aliases.Add(aliasItem);
        return;
    }

    PhoneNumber phoneNumberItem = item as PhoneNumber;
    if(phoneNumberItem != null) 
    {
         phoneNumbers.Add(phoneNumberItem);
    }
}

答案 1 :(得分:0)

为什么不将所有列表保存在列表字典中?

private Dictionary<Type, List<GenericCustomerInformation>> MyLists;

public List<GenericCustomerInformation> GetLists<T>()
{
    return MyLists[typeof(T)];
}

public void AddToLists<T>(GenericCustomerInformation item)
{
    GetLists<T>().Add(item);
}