gpt4 book ai didi

c# - 是否可以按输入类型重载泛型方法?

转载 作者:行者123 更新时间:2023-11-30 14:07:56 26 4
gpt4 key购买 nike

简而言之,我希望有一些方法可以实现这种 API 风格:

Repo repo = new Repo();
List<Car> cars = repo.All<Car>();
List<Truck> trucks = repo.All<Truck>();

我有一个 Repo从数据库中检索对象的对象。目前它是这样工作的:

Repo repo = new Repo();
List<Car> cars = repo.Cars.All();
List<Truck> trucks = repo.Trucks.All();

哪里Repo类是:

class Repo {
List<Car> Cars = new CarRepo();
List<Truck> Trucks = new TruckRepo();
}

在哪里CarRepoTruckRepo每个包含:

interface IRepo<T> {
List<T> All();
}

class CarRepo : IRepo<Car> {
List<Car> All() => new List<Car>() { };
}
// Same for TruckRepo

不幸的是,如果我想向这个模式添加新的车辆集合,我需要在 Repo 上创建一个新列表。目的。在这个人为的例子中,这没什么大不了的,但是这个上帝- Repo在具有许多子存储库的应用程序中,对象可能会变得非常大。我宁愿拥有 Repo类(class)工具All直接。

这是我最接近的:

interface IRepo<T>
{
List<T> All<T>();
}

partial class Repo {}

partial class Repo : IRepo<Car>
{
public List<Car> All<Car>() => new List<Car>() { };
}

partial class Repo : IRepo<Truck>
{
public List<Truck> All<Truck>() => new List<Truck>() { };
}

// Usage:
Repo repo = new Repo();
List<Car> cars = repo.All<Car>();

这会添加 All<> Repo 的方法, 但由于一些我不知道解决方案的问题,它甚至无法编译。

  • All<>Repo 实现了两次因为类型不影响实际的方法签名
  • 第二个TList<T> All<T>是多余的
  • List<Car> All<Car> , Car只是另一种写法 T , 而不是指实际的 Car

这是我第一次深入研究 C# 中的适当泛型 - 这甚至可能吗?

最佳答案

这不是分部类的用途。分部类的具体用途是将类的功能拆分到多个文件中。

使用泛型时,目的是定义通用的核心功能,然后可以由多个具体类型重用。

因此,您应该为每种类型创建一个新的具体存储库类。

interface IRepo<T>
{
List<T> All<T>();
}

class CarRepo : IRepo<Car>
{
public List<Car> All<Car>() => new List<Car>() { };
}

class TruckRepo : IRepo<Truck>
{
public List<Truck> All<Truck>() => new List<Truck>() { };
}

public class Truck { }
public class Car { }

关于c# - 是否可以按输入类型重载泛型方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37733802/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com