gpt4 book ai didi

c# - 将具体实现作为通用返回

转载 作者:行者123 更新时间:2023-11-30 19:52:49 25 4
gpt4 key购买 nike

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

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;
}

最佳答案

我建议从以下开始:

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 - 而不是它由调用者定义。

关于c# - 将具体实现作为通用返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53101427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com