返回通用的具体实现

时间:2018-11-01 12:38:10

标签: c# oop generics generic-programming bogus

我有一个看起来像这样的界面:

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>,因为那样便无法访问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;
}

1 个答案:

答案 0 :(得分:7)

我建议以:

开头
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()的{​​{1}}约束被明确定义为T ,而不是由调用方定义。