这可以在 C# 中简化吗?
Can this be simplified in C#?
我有一些重复的代码,但不确定简化它的最佳方法。
private void CheckData(long PKID, int ExpectedResult, string Server)
{
var a = _ARepo.GetAll();
var b = _BRepo.GetAll();
if(Server == "A")
{
a.Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
}
if (Server == "B")
{
b.Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
}
}
这是一个单元测试项目,我正在使用 Shouldly
库。任何想法表示赞赏。
您可以创建一个辅助方法来处理这种重复:
private void CheckFind<T>(List<T> a, int expectedId) where T : IWithId {
a.Find(x => x.PKID == PKID).Result.ShouldBe(expectedId);
}
从CheckData
调用此方法两次:
if(Server == "A") {
CheckFind(_ARepo.GetAll(), ExpectedResultId);
}
if(Server == "B") {
CheckFind(_BRepo.GetAll(), ExpectedResultId);
}
是的,如果您可以让代码重构您的代码,并且您的 _ARepo.GeAll
和 _BRepo.getAll
在返回类型中实现相同的接口,这将类似于以下内容
private void CheckData(long PKID, int ExpectedResult, string Server, IRepo repo)
{
var b = repo.GetAll();
b.Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
}
private void CheckData(long PKID, int ExpectedResult, string Server)
{
//Setting to empty because I don't know what happens if it is not "A" nor "B"
IEnumerable<YourType> data = Enumerable.Empty<YourType>();
if(Server == "A")
data = _ARepo.GetAll();
else if(Server == "B")
data = _BRepo.GetAll();
data.Find(Find(x => x.PKID == PKID).Result.ShouldBe(expectedId);
}
如果 Server
值只能是 A
或 B
那么您可以用 if else
或更好的 ?:
运算符替换
然后它看起来像:
var data = Server == "A" ? _ARepo.GetAll() : _BRepo.GetAll();
data.Find(Find(x => x.PKID == PKID).Result.ShouldBe(expectedId);
在两个 Repo
实现相同接口的情况下,更好的设计是将 IRepo
作为函数的参数。这样函数只有 1 个作用——检查数据(而不是决定检查哪些数据)
使用一些简短的 if 符号,您可以使用以下内容
假设以下 _ARepo 和 _BRepo 相同,来自相同 class 但不同的连接字符串
private void CheckData(long PKID, int ExpectedResult, string Server)
{
BaseType repo = Server == "A" ? _ARepo : _BRepo;
repo.GetAll().Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
}
假设它们不是相同的 BaseType 但 GetAll() 是 IEnumerable
private void CheckData(long PKID, int ExpectedResult, string Server)
{
IEnumerable<YourType> repo = Server == "A" ? _ARepo.GetAll() : _BRepo.GetAll();
repo.Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
}
如果所有 Repos 实现相同的接口(如 IRepo)。你可以像这样创建一个辅助方法
private IRepo GetRepo(string server)
{
var repos = new Dictionary<string, IRepo>
{
{ "A", _ARepo },
{ "B", _BRepo }
};
return repos[server];
}
使用非常简单
private void CheckData(long PKID, int ExpectedResultId, string Server)
{
var repo = GetRepo(Server);
repo.GetAll().Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
}
我有一些重复的代码,但不确定简化它的最佳方法。
private void CheckData(long PKID, int ExpectedResult, string Server)
{
var a = _ARepo.GetAll();
var b = _BRepo.GetAll();
if(Server == "A")
{
a.Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
}
if (Server == "B")
{
b.Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
}
}
这是一个单元测试项目,我正在使用 Shouldly
库。任何想法表示赞赏。
您可以创建一个辅助方法来处理这种重复:
private void CheckFind<T>(List<T> a, int expectedId) where T : IWithId {
a.Find(x => x.PKID == PKID).Result.ShouldBe(expectedId);
}
从CheckData
调用此方法两次:
if(Server == "A") {
CheckFind(_ARepo.GetAll(), ExpectedResultId);
}
if(Server == "B") {
CheckFind(_BRepo.GetAll(), ExpectedResultId);
}
是的,如果您可以让代码重构您的代码,并且您的 _ARepo.GeAll
和 _BRepo.getAll
在返回类型中实现相同的接口,这将类似于以下内容
private void CheckData(long PKID, int ExpectedResult, string Server, IRepo repo)
{
var b = repo.GetAll();
b.Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
}
private void CheckData(long PKID, int ExpectedResult, string Server)
{
//Setting to empty because I don't know what happens if it is not "A" nor "B"
IEnumerable<YourType> data = Enumerable.Empty<YourType>();
if(Server == "A")
data = _ARepo.GetAll();
else if(Server == "B")
data = _BRepo.GetAll();
data.Find(Find(x => x.PKID == PKID).Result.ShouldBe(expectedId);
}
如果 Server
值只能是 A
或 B
那么您可以用 if else
或更好的 ?:
运算符替换
然后它看起来像:
var data = Server == "A" ? _ARepo.GetAll() : _BRepo.GetAll();
data.Find(Find(x => x.PKID == PKID).Result.ShouldBe(expectedId);
在两个 Repo
实现相同接口的情况下,更好的设计是将 IRepo
作为函数的参数。这样函数只有 1 个作用——检查数据(而不是决定检查哪些数据)
使用一些简短的 if 符号,您可以使用以下内容 假设以下 _ARepo 和 _BRepo 相同,来自相同 class 但不同的连接字符串
private void CheckData(long PKID, int ExpectedResult, string Server)
{
BaseType repo = Server == "A" ? _ARepo : _BRepo;
repo.GetAll().Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
}
假设它们不是相同的 BaseType 但 GetAll() 是 IEnumerable
private void CheckData(long PKID, int ExpectedResult, string Server)
{
IEnumerable<YourType> repo = Server == "A" ? _ARepo.GetAll() : _BRepo.GetAll();
repo.Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
}
如果所有 Repos 实现相同的接口(如 IRepo)。你可以像这样创建一个辅助方法
private IRepo GetRepo(string server)
{
var repos = new Dictionary<string, IRepo>
{
{ "A", _ARepo },
{ "B", _BRepo }
};
return repos[server];
}
使用非常简单
private void CheckData(long PKID, int ExpectedResultId, string Server)
{
var repo = GetRepo(Server);
repo.GetAll().Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
}