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显然你的项目引用了另一个引用了第一个的项目。然而,这远远超出了这个问题的范围,因为您没有提到定义这些类型的程序集。