C# 将泛型类型限制为类型列表。有解决办法吗?

C# 将泛型类型限制为类型列表。有解决办法吗?,c#,generics,C#,Generics,是否有一个技巧或解决方法来设置泛型类型约束,使其只允许两种类型:int和Guid?或者通常是允许的类型列表 我有大量类似的方法: public IVehicle<TVehicleId> GetVehicle(TVehicleId? vehicleId) { switch (vehicleId) { case int vid: return ApplicationDbContext.VehicleRepo.Single(x =&g

是否有一个技巧或解决方法来设置泛型类型约束,使其只允许两种类型:int和Guid?或者通常是允许的类型列表

我有大量类似的方法:

public IVehicle<TVehicleId> GetVehicle(TVehicleId? vehicleId)
{
    switch (vehicleId)
    {
        case int vid:
            return ApplicationDbContext.VehicleRepo.Single(x => x.VehicleId == vid);
        case Guid vid:
            return ApplicationDbContext.ExVehicleRepo.Single(x => x.ExVehicleId == vid);
        default:
            throw new NotSupportedException("Vehicle Id can be either int or Guid, but was : " + typeof(TVehicleId));
    }
}
公共车辆获取车辆(车辆ID?车辆ID)
{
开关(车辆ID)
{
案例int vid:
返回ApplicationDbContext.VehicleRepo.Single(x=>x.VehicleId==vid);
案例Guid视频:
返回ApplicationDbContext.ExVehicleRepo.Single(x=>x.ExVehicleId==vid);
违约:
抛出新的NotSupportedException(“车辆Id可以是int或Guid,但was:“+typeof(TVehicleId));
}
}
当车辆id既不是int也不是Guid时,总是会引发NotSupportedException的默认情况


我想消除抛出这些异常的需要,并在编译时将TVehicleId限制为int和Guid。我想知道是否有人试图找到这样做的方法?

它需要是通用的吗?听起来超载
GetVehicle
可能是最简单的方法

公共车辆获取车辆(内部车辆ID)
{
返回ApplicationDbContext.VehicleRepo.Single(x=>x.VehicleId==VehicleId);
}
公共车辆获取车辆(Guid车辆ID)
{
返回ApplicationDbContext.ExVehicleRepo.Single(x=>x.ExVehicleId==vehicleId);
}

您的实际问题是允许使用两种不兼容的数据类型访问数据库。将方法更改为您最喜欢的(int或guid)并更改其余代码。你在制造复杂性。不,这是不可能的。除了两个函数外,您可以进行模拟的“最佳”方法是使用
object
并自己进行类型检查。但那太可怕了。实际上,你能做的最好的事情就是修复你的数据库方案。@Moo Juice:我希望我能这样做。然而,这是一大块遗留代码,没有机会更改数据库模式。实际上,这是一个好问题。唯一的模式是我处理的遗留代码在无数个地方重复这个模式,因此需要大量重构工作来替换泛型,方法是像这里这样重载,或者在其他地方用一个抽象类和两个实现来替换多态性。这就是为什么我在我的问题中寻找类似的东西。