传递通用列表

Passing A Generic List

我正在尝试传递通用列表,但出现以下错误:

Error CS1503 Argument 2: cannot convert from 'System.Collections.Generic.List<PersonManager.Client>' to 'System.Collections.Generic.List<System.Collections.Generic.List<PersonManager.Client>>'

public static bool FillDropDownBox<T>(ComboBox box, List<T> list, string displayMember, string valueMember) where T:List<T>
{
    if (list.Count > 0)
    {
        box.Items.Clear();
        box.Items.AddRange(list.ToArray());                
        box.DisplayMember = displayMember;
        box.ValueMember = valueMember;
        return true;
    }
    else
    {
        Debug("List is empty");
        return false;
    }            
}

public static List<Client> ClientList = new List<Client>();


public static void FillClientBox(ComboBox box, Control control)
{
    if(FillDropDownBox<List<Client>>(box, ClientList, "Nickname", "Id")){
}

}

解决方案代码:

public static bool FillDropDownBox<T>(ComboBox box, List<T> list, string displayMember, string valueMember) where T:class
        {
            if (list.Count > 0)
            {
                box.Items.Clear();
                box.Items.AddRange(list.ToArray());                
                box.DisplayMember = displayMember;
                box.ValueMember = valueMember;
                box.SelectedIndex = 0;
                return true;
            }
            else
            {
                Debug("List is empty");
                return false;
            }            
        }

        public static void FillClientBox(ComboBox box, Control control)
        {
            if(FillDropDownBox(box, ClientList, "Nickname", "Id"))          
            {
            }
        }

在您的 FillDropDownBox<List<Client>> 方法中,您必须有一个这样的参数:

List<T> listOfClients,

所以你必须把它写到:

T listOfClients,

在你的方法中:

public static bool FillDropDownBox<T>(ComboBox box, List<T> list, string displayMember, string valueMember) where T:List<T> 

T 指定填充 List 的对象类型,您将其限制为列表的列表!

所以当你调用它时,你将它指定为整个列表,但你只传递了一个普通列表,我假设它是 List<Client>:

FillDropDownBox<List<Client>>(box, ClientList, "Nickname", "Id")

所以编译器需要一个列表列表!那是你的问题。

将限制更改为 where T:class

实际上你应该能够完全删除显式声明并且编译器可以从传递的列表中推断出类型 ClientList

public static void FillClientBox(ComboBox box, Control control)
{
    if(FillDropDownBox(box, ClientList, "Nickname", "Id")){
}

您只需要这样做:

public static bool FillDropDownBox<T>(ComboBox box, List<T> list, string displayMember, string valueMember)
{
    if (list.Count > 0)
    {
        box.Items.Clear();
        box.Items.AddRange(list.ToArray());
        box.DisplayMember = displayMember;
        box.ValueMember = valueMember;
        return true;
    }
    else
    {
        Debug("List is empty");
        return false;
    }
}

public static void FillClientBox(ComboBox box, Control control)
{
    if (FillDropDownBox<Client>(box, ClientList, "Nickname", "Id"))
    {
    }
}

因为参数是List<T>所以不需要约束T.

而当您调用 FillDropDownBox 时,您只需要指定类型 - 如果您将其指定为 List<Client>,则表示 list 参数是 List<List<Client>>.