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