Возврат конкретной реализации в качестве универсального
У меня есть интерфейс, который выглядит так:
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());
}
}
Проблема в том, что я не могу вернуть Faker<Dog>
на месте Faker<T>
например
Bogus.Faker<_scratchpad.models.Dog>' to 'Bogus.Faker<T>
Очевидно, я не могу изменить new Faker<Dog>
в new Faker<T>
потому что тогда я не могу получить доступ к свойствам собаки.
Я хочу использовать объект так:
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;
}
1 ответ
Решение
Я бы предложил начать с:
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
- а не это определяется вызывающим абонентом.