首页 > 解决方案 > 在 C# 中返回自定义泛型方法

问题描述

我想从接受泛型类型的方法返回自定义泛型类型。我看过这篇文章,但它没有解释如何处理自定义返回类型,因为我需要将自定义类型转换为泛型类型。

将自定义类型转换为泛型类型的推荐方法是什么?

例如:我想打电话给:

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 之类的东西,它将驻留在基类中。每个子类将使用不同的结果填充网格。

标签: c#generics

解决方案


为了IQueryable<UsersDto>从一个承诺返回的方法返回一个,和IQueryable<T>之间必须有关系。TUsersDto

您可以通过引入一个接口,将其应用于 DTO 并将通用参数约束到该接口来做到这一点:

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
        }
    // ...
}

该接口是可选的,也可以直接约束为UserDto.


推荐阅读