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

C# 在c中返回自定义泛型方法,c#,generics,C#,Generics,我想从接受泛型类型的方法返回一个自定义泛型类型。 我看过post,但它没有解释如何处理自定义返回类型,因为我需要将my自定义类型转换为泛型类型 建议使用什么方法将自定义类型转换为泛型类型 例如: 我想打电话: var users = GetUsers<UsersDto>(); 在哪里 编辑: GetUsers可能太具体了,可能会混淆为什么使用泛型是合适的。 GetUsers应该被称为GetGridResults,它将驻留在基类中。每个子类将使用不同的结果填充网格。为了能够返回具有U

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

建议使用什么方法将自定义类型转换为泛型类型

例如: 我想打电话:

var users = GetUsers<UsersDto>();
在哪里

编辑:

GetUsers可能太具体了,可能会混淆为什么使用泛型是合适的。
GetUsers应该被称为GetGridResults,它将驻留在基类中。每个子类将使用不同的结果填充网格。

为了能够返回具有UserId和UserName属性的类型,必须有一个基类或一个接口,您希望作为T实现的类型传递该接口。然后,泛型方法必须能够推断泛型类型参数实际上具有这些属性。此外,您需要新约束能够轻松创建满足类型约束的新对象

试一试

为了从承诺返回IQueryable的方法返回IQueryable,T和UsersDto之间必须存在关系

可以通过引入接口、将接口应用于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

有两件事:

为了能够执行新的T,然后设置UsersDto字段,您需要在通用参数上设置一些约束,其中T:UsersDto,new。显然,T必须是UsersDto或UsersDto的超类

要拥有IQueryable,如果db.Users已经是IQueryable,那么您已经拥有了IQueryable,否则使用.AsQueryable,但请注意,在本例中,它将是一个伪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;  //It is IQueryable<UsersDto> now
}
但我不认为这是你想要的。泛型方法不知道它们应该对该类型t做什么,以及如何创建该类型的对象; 您还可以将lambda传递给方法,该方法将被执行以生成T类型的对象,但它看起来并不是干净的代码,也不是一种可行的方法


也许你可以分享你的想法导致你出现这个问题?

这不应该出现。你可以把自己扭曲成一个答案,但错误发生得更早

我认为GetUsers是服务类的一部分。然后我们就可以

public interface IUserService<T> { IEnumerable<T> GetUsers(); }

public MyUserService : IUserService<UserDTO>
{
   public IEnumerable<UserDTO> GetUsers() { /* no problems here */ }
}

T和UserDto之间的关系应该是什么。。。为什么它应该是合法的?GetUsers中的用户来自基类中的抽象。也许GetUsers作为方法名不是最好的。像GetGridData这样的东西使它更通用。问题是我的基类需要打印不同格式的结果。如果您将GetUsers重命名为PrintResults,那么整个过程就更有意义了。每个孩子都会通过一个单独的T来打印。好吧,几乎所有的答案都指向同一个解决方案。我会接受这一次,因为它是第一次。我不打算选择接口路径,因为它是可选的,只是增加了一个复杂度。谢谢大家!!!!谢谢,但请注意这一点。
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();
}
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
}
public interface IUserService<T> { IEnumerable<T> GetUsers(); }

public MyUserService : IUserService<UserDTO>
{
   public IEnumerable<UserDTO> GetUsers() { /* no problems here */ }
}