c# - 将具体实现作为泛型返回
问题描述
我有一个如下所示的界面:
public interface IFaker
{
Faker<T> GetFaker<T>() where T : class;
}
public class DogFaker : IFaker
{
public Faker<T> GetFaker<T>() where T : class
{
return new Faker<Dog>()
.RuleFor(dog => dog.Name, f => f.Name.FirstName(Name.Gender.Male))
.RuleFor(dog => dog.IsGoodBoy, f => f.Random.Bool());
}
}
问题是 - 我不能返回 aFaker<Dog>
代替Faker<T>
例如
Bogus.Faker<_scratchpad.models.Dog>' to 'Bogus.Faker<T>
显然我无法更改new Faker<Dog>
为,new Faker<T>
因为那时我无法访问 Dog 属性。
我想像这样使用对象:
private Dictionary<string, object> _fakers;
public FakerService()
{
_fakers = InitialiseFakers();
}
private Dictionary<string, object> InitialiseFakers()
{
return new Dictionary<string, object>()
{
{typeof(Dog).FullName, new DogFaker().GetFaker<Dog>()}
};
}
public IEnumerable<T> Generate<T>(int count) where T : class
{
var faker = GetFaker<T>();
return faker.Generate(count);
}
private Faker<T> GetFaker<T>() where T : class
{
var faker = (Faker<T>)_fakers[typeof(T).FullName];
return faker;
}
解决方案
我建议从以下开始:
public interface IFaker<T> where T : class
{
Faker<T> GetFaker();
}
public class DogFaker : IFaker<Dog>
{
public Faker<Dog> GetFaker()
{
return new Faker<Dog>()
// whatever else you need here
;
}
}
这种方式DogFaker.GetFaker()
将其T
约束明确定义为Dog
- 而不是由调用者定义。
推荐阅读
- r - 将数值传递给使用 dplyr 的函数
- ios - 为什么切换应用程序时显示应用程序图标nt
- c# - C# - 将 JSON 反序列化为 ValueTuple
- java - /etc/timezone 在 anapsix/alpine-java:8_server-jre docker 映像上不存在
- c# - 具有空值的 IsNullOrEmpty 仍会进入循环
- scala - Scala - 如何使用 ISODateTimeFormat 将 DateTime 解析为自定义格式?
- haskell - 镜头重复记录场如何处理?
- android-studio - Android studio 蓝牙外接键盘和原生键盘
- swift - UITap 手势无法识别
- java - Ignition.start() 遇到警告“仍在等待初始分区映射交换”