如何根据枚举限制方法参数?

How can you restrict a method parameter based on an enum?

我觉得这是某种反模式,但基本上我有 2 个版本的相同类型的 repo,它们具有相同类型的属性和方法。我玩过接口和抽象 class 的想法,但在这两种情况下我都无法绕过看似不必要的检查。这是前提(使用抽象class):

public abstract class BaseRepository
{
    public abstract RepositoryType RepositoryType { get; } //enum of File or DataBase
    public abstract CreateResult CreateItem (Item item);
    public abstract DeleteResult DeleteItemById(Guid Id);
    public abstract Item GetItem(Guid Id);
}

public class Item
{
    public Guid Id { get; }
    public string Name { get; }
    public ItemType ItemType { get; } //enum of File or DataRecord
    
    //other props...
}

public FileRepository : BaseRepository
{
    public override RepositoryType RepositoryType => RepositoryType.File
    
    public override CreateResult CreateItem(Item item)
    {
        if(item.ItemType != ItemType.File) throw InvalidOperationException("some error message") //problem is here

        //some logic.
    }

    //other overrides....
}

所以有一个通过 BaseRepository 为存储库创建的基本契约,它被 FileRepository 覆盖。一个项目基本上具有相同的东西,无论它是 File 项目还是 DataRecord 项目(可以说有一个 IItem 接口,然后是 DataRecord 和 File 的 2 个独立项目而不是枚举,但这仍然不能解决问题)。

问题是我不知道如何将只有 ItemType 文件的项目传递到 FileRepository。感觉应该有一种方法可以确保 FileRepository 只接收 File 类型的项目,并且不必进行检查以确保它具有正确的类型。我该怎么做?

使存储库通用,并为每种类型的项目引入类型。例如:

public abstract class Item
{

}
public class FileItem : Item
{

}
public abstract class Repository<TItem> where TItem : Item
{
    public virtual string RepositoryType => typeof(TItem).Name;
    public abstract CreateResult CreateItem(TItem item);
    public abstract DeleteResult DeleteItemById(Guid Id);
    public abstract Item GetItem(Guid Id);
}

public class FileRepository : Repository<FileItem>
{
    public override CreateResult CreateItem(FileItem item)
    {
        throw new NotImplementedException();
    }

    public override DeleteResult DeleteItemById(Guid Id)
    {
        throw new NotImplementedException();
    }

    public override Item GetItem(Guid Id)
    {
        throw new NotImplementedException();
    }
}