在c#中返回自定义泛型方法

时间:2018-05-30 11:12:04

标签: c# generics

我想从接受泛型类型的方法返回自定义泛型类型。 我查看了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的东西,它将驻留在基类中。每个子类将使用不同的结果填充网格。

5 个答案:

答案 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)

为了能够返回具有属性UserIdUserName的类型,必须有一个基类或一个类型,您要传递的类型为{{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的对象的方法,但它看起来不像是干净的代码和一种方法。

可能你可以分享你的想法,导致你遇到这个问题吗?