我想从接受泛型类型的方法返回自定义泛型类型。 我查看了this帖子,但它没有解释如何处理自定义返回类型,因为我需要将我的自定义类型转换为泛型类型。
将自定义类型转换为泛型类型的推荐方法是什么?
例如: 我想打个电话:
var users = GetUsers<UsersDto>();
,其中
internal IQueryable<T> GetUsers<T>()
{
var result = from u in db.Users
select new UsersDto()
{
UserID = u.ID,
UserName = u.Name
};
return result; //This is the problem as it can't convert UsersDto to T
}
修改
GetUsers可能过于具体,可能会混淆为什么使用泛型是合适的。 GetUsers应该被称为类似GetGridResults的东西,它将驻留在基类中。每个子类将使用不同的结果填充网格。
答案 0 :(得分:4)
为了从承诺返回data want(drop = remain_list);
length remain_list $ 20;
do until(last.group);
set have;
by group;
if status = 'REMAINING' and not find(remain_list, country) then
remain_list = catx(' ', remain_list, country);
end;
do until(last.group);
set have;
by group;
if status = 'DELETED' and not find(remain_list, strip(country)) then
output;
end;
run;
的方法返回IQueryable<UsersDto>
,IQueryable<T>
和T
之间必须存在关联。
您可以通过引入一个接口,将其应用于DTO并将泛型参数约束到该接口来实现此目的:
UsersDto
界面是可选的,您也可以直接约束public interface IUserDto
{
int UserID { get; set; }
string UserName { get; set; }
}
public class UserDto : IUserDto { ... }
public IQueryable<TUserDto> GetUsers<TUserDto>()
where TUserDto : class, IUserDto, new()
{
// ...
new TUserDto
{
UserID = u.ID,
UserName = u.Name
}
// ...
}
。
答案 1 :(得分:2)
为了能够返回具有属性UserId
和UserName
的类型,必须有一个基类或一个类型,您要传递的类型为{{1实现。然后,泛型方法必须能够推断泛型类型参数确实具有这些属性。此外,您需要T
约束才能轻松创建满足类型约束的新对象。
尝试
new()
答案 2 :(得分:2)
两件事:
为了能够执行new T()
然后设置UsersDto
字段,您需要在通用参数(where T : UsersDto, new()
)上设置一些约束。显然,T
必须是UsersDto
或超级UsersDto
。
要获得IQueryable<T>
,如果db.Users
已经是IQueryable<User>
,那么您已经拥有IQueryable<T>
,否则请使用.AsQueryable()
,但请注意这将是一个&#34;假的&#34;在这种情况下IQueryable<>
(在本地计算机上执行IQueryable<>
)
internal IQueryable<T> GetUsers<T>() where T : UsersDto, new()
{
var result = from u in db.Users
select new T()
{
UserID = u.ID,
UserName = u.Name
};
return result;
// return result.AsQueryable();
}
答案 3 :(得分:2)
这不应该出现。您可以将自己扭曲成答案,但错误发生在之前。
我认为GetUsers是Service类的一部分。我们可以有
public interface IUserService<T> { IEnumerable<T> GetUsers(); }
public MyUserService : IUserService<UserDTO>
{
public IEnumerable<UserDTO> GetUsers() { /* no problems here */ }
}
答案 4 :(得分:1)
你可以这样做:
internal IQueryable<T> GetUsers<T>() where T : UsersDto, new()
{
var result = from u in db.Users
select new T()
{
UserID = u.ID,
UserName = u.Name
};
return result; //It is IQueryable<UsersDto> now
}
但我不认为这就是你想要的。通用方法无法知道它们对T类型的影响,以及它们应该如何创建它的对象; 您还可以将lambda传递给将被执行以生成类型为T的对象的方法,但它看起来不像是干净的代码和一种方法。
可能你可以分享你的想法,导致你遇到这个问题吗?