C# 不理解

C# 不理解,c#,generics,polymorphism,C#,Generics,Polymorphism,我有两个从同一个基类派生的类 public class AugInfo { public string UserId { get; set; } public string Email { get; set; } public bool EmailConfirmed { get; set; } public string PhoneNumber { get; set; } public string FirstName { get; set; }

我有两个从同一个基类派生的类

public class AugInfo
{
    public string UserId { get; set; }
    public string Email { get; set; }
    public bool EmailConfirmed { get; set; }
    public string PhoneNumber { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Name { get { return FirstName + " " + LastName; } }
    public string Company { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public Boolean LockedOut { get; set; }

    public string Country { get; set; }
    public int ModelsCount { get; set; }
    public DateTime CreateDate { get; set; }
    public string LoginProvider { get; set; }

    public AugInfo() { }
}

以及下面描述的两个功能

    protected List<AdminUserInfo> FilterUsers(List<AdminUserInfo> users,SearchViewModel<AdminUserInfo, EnumUserSort> search)
    {
        if (!string.IsNullOrEmpty(search.SearchString))
        {
            users = users.Where(d => 
             d.Email.ToLower().Contains(search.SearchString.ToLower())
                  || d.Name.ToString().Contains(search.SearchString) ||
                  d.Company.ToString().ToLower().Contains(search.SearchString.ToLower())).ToList();
        }
        return users;
    }


 protected List<GroupUserInfo> FilterUsers(List<GroupUserInfo> users,SearchViewModel<GroupUserInfo, EnumUserSort> search)
    {
        if (!string.IsNullOrEmpty(search.SearchString))
        {
            users = users.Where(d => d.Email.ToLower().Contains(search.SearchString.ToLower())
              || d.Name.ToString().Contains(search.SearchString) ||
              d.Company.ToString().ToLower().Contains(search.SearchString.ToLower())).ToList();
        }
        return users;
    }
但不幸的是,我不能调用这个函数

 List<AdminUserInfo> users= FilterUsers(users, search);
列出用户=过滤器用户(用户,搜索);

我得到了conver error

您需要对
T
进行egeneric约束,以便只有从
AugInfo
派生的类型才能用作泛型参数:

protected List<T> FilterUsers<T>(List<T> users, SearchViewModel<T, EnumUserSort> search) where T: AugInfo
{
    if (!string.IsNullOrEmpty(search.SearchString))
    {
        users = users.Where(d => 
            d.Email.ToLower().Contains(search.SearchString.ToLower())
                || d.Name.ToString().Contains(search.SearchString) 
                || d.Company.ToString().ToLower().Contains(search.SearchString.ToLower())).ToList();
    }
    return users;
}
受保护的列表过滤器用户(列表用户,SearchViewModel搜索),其中T:AugInfo
{
如果(!string.IsNullOrEmpty(search.SearchString))
{
用户=用户。其中(d=>
d、 Email.ToLower()包含(search.SearchString.ToLower())
||d.Name.ToString()包含(search.SearchString)
||d.Company.ToString().ToLower().Contains(search.SearchString.ToLower()).ToList();
}
返回用户;
}

您需要对
T
进行egeneric约束,以便只有从
AugInfo
派生的类型才能用作泛型参数:

protected List<T> FilterUsers<T>(List<T> users, SearchViewModel<T, EnumUserSort> search) where T: AugInfo
{
    if (!string.IsNullOrEmpty(search.SearchString))
    {
        users = users.Where(d => 
            d.Email.ToLower().Contains(search.SearchString.ToLower())
                || d.Name.ToString().Contains(search.SearchString) 
                || d.Company.ToString().ToLower().Contains(search.SearchString.ToLower())).ToList();
    }
    return users;
}
受保护的列表过滤器用户(列表用户,SearchViewModel搜索),其中T:AugInfo
{
如果(!string.IsNullOrEmpty(search.SearchString))
{
用户=用户。其中(d=>
d、 Email.ToLower()包含(search.SearchString.ToLower())
||d.Name.ToString()包含(search.SearchString)
||d.Company.ToString().ToLower().Contains(search.SearchString.ToLower()).ToList();
}
返回用户;
}

此处应使用泛型:

protected List<T> FilterUsers<T>(List<T> users, SearchViewModel<T, EnumUserSort> search) where T : AugInfo {
    if (!string.IsNullOrEmpty(search.SearchString)) {
        users = users.Where(d =>
         d.Email.ToLower().Contains(search.SearchString.ToLower())
              || d.Name.ToString().Contains(search.SearchString) ||
              d.Company.ToString().ToLower().Contains(search.SearchString.ToLower())).ToList();
    }
    return users;
}
受保护的列表过滤器用户(列表用户,SearchViewModel搜索),其中T:AugInfo{
如果(!string.IsNullOrEmpty(search.SearchString)){
用户=用户。其中(d=>
d、 Email.ToLower()包含(search.SearchString.ToLower())
||d.Name.ToString()包含(search.SearchString)||
d、 Company.ToString().ToLower().Contains(search.SearchString.ToLower()).ToList();
}
返回用户;
}

在这里仅仅写
List
是不够的,因为
List
不是同时逆变和协变的(这种东西在C#中不存在)。您不能将
List
转换为
List

,此处应使用泛型:

protected List<T> FilterUsers<T>(List<T> users, SearchViewModel<T, EnumUserSort> search) where T : AugInfo {
    if (!string.IsNullOrEmpty(search.SearchString)) {
        users = users.Where(d =>
         d.Email.ToLower().Contains(search.SearchString.ToLower())
              || d.Name.ToString().Contains(search.SearchString) ||
              d.Company.ToString().ToLower().Contains(search.SearchString.ToLower())).ToList();
    }
    return users;
}
受保护的列表过滤器用户(列表用户,SearchViewModel搜索),其中T:AugInfo{
如果(!string.IsNullOrEmpty(search.SearchString)){
用户=用户。其中(d=>
d、 Email.ToLower()包含(search.SearchString.ToLower())
||d.Name.ToString()包含(search.SearchString)||
d、 Company.ToString().ToLower().Contains(search.SearchString.ToLower()).ToList();
}
返回用户;
}

在这里仅仅写
List
是不够的,因为
List
不是同时逆变和协变的(这种东西在C#中不存在)。您不能将
列表
转换为
列表

为什么不能?你试了什么?当你尝试时发生了什么?为什么这些解决方案不起作用?请给我一分钟时间编辑我的帖子,并添加我尝试执行的操作。提示:FilterUsers()的参数使用离散类,尽管这里根本没有必要这样做。请改为使用IEnumerable作为列表。为什么不可能呢?正如@HimBromBeere正确指出的那样,您需要对t进行类型约束,因此它应该看起来像:受保护的列表过滤器用户(列表用户,SearchViewModel search),其中t:auginfo为什么不能这样做?你试了什么?当你尝试时发生了什么?为什么这些解决方案不起作用?请给我一分钟时间编辑我的帖子,并添加我尝试执行的操作。提示:FilterUsers()的参数使用离散类,尽管这里根本没有必要这样做。请尝试将IEnumerable用于列表。为什么不可能呢?正如@HimBromBeere正确指出的,您需要对t进行类型约束,因此它应该看起来像:受保护的列表过滤器用户(列表用户,SearchViewModel search),其中t:AugInfoIt是我想要的,但现在我遇到了一个错误
导入的类型AugInfo无效。它包含循环基类依赖项
。这个错误的原因是什么?@KarenAvdalyan显然你的项目引用了另一个引用了第一个的项目。然而,这远远超出了这个问题的范围,因为您没有提到定义这些类型的程序集。这正是我想要的,但现在我有一个错误
导入的类型AugInfo无效。它包含循环基类依赖项
。这个错误的原因是什么?@KarenAvdalyan显然你的项目引用了另一个引用了第一个的项目。然而,这远远超出了这个问题的范围,因为您没有提到定义这些类型的程序集。