如何根据枚举限制方法参数?
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();
}
}
我觉得这是某种反模式,但基本上我有 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();
}
}