假设我有一个具体的类——“Giraffe”,它实现了“IMammal”。在我的场景中,我可以像这样创建一个通用存储库和工厂:
public MammalFactory : IMammalFactory
{
public IMammalRepository<T> GetMammalRepo<T>() where T: IMammal, new()
{
return new MammalRepository<T>();
}
}
MammalRepository 现在可以是 Giraffe 或 Antelope 类型,只要它们都实现了 IMammal。到目前为止,一切都很好。
但是,我不能使用这样的表达式(不会编译也不能强制转换):
Func<IMammalRepository<IMammal>> = () => this.factory.GetMammalRepo<Giraffe>();
我的类之间有一个非常相似的方法,我想将它们分解为:
//called from different implementations
public void FeedAnimalInternal(Func<IMammalRepository<IMammal>> repo, Action<IMammal> doIt)
{
var animalRepo = repo();
var animals = animalRepo.GetAnimals(); //might be giraffe or might be something else
foreach (var animal in animals) { doIt(animal); }
}
首先,为什么 Func<> (第一个)不能编译?这是协方差的事情吗?接下来,知道如何完成类似于我正在尝试做的事情吗?