提问人:jeancallisti 提问时间:6/1/2023 最后编辑:Progmanjeancallisti 更新时间:6/1/2023 访问量:30
对 Response 类型进行别名的最紧凑方法是什么?
What is the most compact way of aliasing a Response type?
问:
.Net 6、c# 10 和 .Net 7、c#11 或更高版本
这个问题不仅与别名有关。它更广泛。
场景:
public class Item {
public int x { get; set;}
}
public interface IMyController {
public Task<IEnumerable<Item>> GetItems();
}
public class MyController {
public async Task<IEnumerable<Item>> GetItems() {
return new List<Item>() { ... };
}
}
想要公开 API 的接口(在本例中为 IMycontroller)是一种常见方案
但是,我很生气,因为返回类型是一个复杂的类型(某物的枚举)。我希望界面是密闭的,不会给最终用户留下任何东西。我想要一个 GetItemsReponse 类型。
像 GraphQL 这样的 Typescript 库是这样做的:
export interface Item { ... }
export type Items = Item[];
export type GetItemsResponse = Items;
问题:
在 C# 中,没有类型的按需通用别名。
解决方案#1:文件中的本地别名。
IMy控制器:.cs
using GetItemsResponse = IEnumerable<Item>;
public interface IMyController {
public Task<GetItemsResponse> GetItems();
}
不完全令人满意,因为最终用户必须在自己的代码中做同样的事情:
using GetItemsResponse = IEnumerable<Item>;
解决方案#2:全局别名
global using GetItemsResponse = IEnumerable<Item>;
对于大多数人来说,这是一个很好的解决方案,但对我来说,这是一个问题,因为我有几种名为“GetItemsResponse”的类型——那是因为我使用版本控制的 API。我不希望这些名字开始在全球范围内发生冲突。
global using GetItemsResponse = IEnumerable<ItemV1>;
global using GetItemsResponse = IEnumerable<ItemV2>; // uh oh, same name!
namespace My.API.v1 {
public interface IMyController {
public Task<IEnumerable<ItemV1>> GetItems(); // I want it to return GetItemsResponse
}
}
namespace My.API.v2 {
public interface IMyController {
public Task<IEnumerable<ItemV2>> GetItems(); I want it to return GetItemsResponse
}
}
解决方案#3:继承类型
public class GetItemsResponse : List<Item> {
...
}
不是很好,因为现在我必须从构造函数开始重新实现 的许多基础方法。List
结论:
在现代 C# 中,有没有一种优雅而紧凑的方式让我忽略了?首先关注 C#11 或更高版本,最后关注 C#10。
答: 暂无答案
下一个:为什么需要石膏?
评论
IEnumerable<Item>