C# 使用泛型进行类型转换
假设我有一个具体的类--“Giraffe”,它实现了“IMammal”。在我的场景中,我可以创建一个通用存储库和工厂,如下所示:C# 使用泛型进行类型转换,c#,generics,C#,Generics,假设我有一个具体的类--“Giraffe”,它实现了“IMammal”。在我的场景中,我可以创建一个通用存储库和工厂,如下所示: public MammalFactory : IMammalFactory { public IMammalRepository<T> GetMammalRepo<T>() where T: IMammal, new() { return new MammalRepository<T>();
public MammalFactory : IMammalFactory
{
public IMammalRepository<T> GetMammalRepo<T>() where T: IMammal, new()
{
return new MammalRepository<T>();
}
}
公共工厂:IMammalFactory
{
公共IMammalRepository getMailomaprepo(),其中T:IMammal,new()
{
返回新的存储库();
}
}
哺乳动物存储库现在可以是长颈鹿或羚羊类型,只要它们都实现IMammal。到目前为止,一切顺利
但是,我不能使用这样的表达式(不会编译也不能强制转换):
Func=()=>this.factory.getrepo();
我的类之间有一个非常相似的方法,我想将它们分解为以下几种:
//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); }
}
//从不同的实现调用
公共无效饲料动物内部(职能回购、行动doIt)
{
var animalRepo=repo();
var-animalRepo.GetAnimals();//可能是长颈鹿或其他动物
foreach(动物中的动物变量){doIt(动物);}
}
首先,为什么Func(第一个)不能编译?这是协方差吗?接下来,你知道我怎样才能完成类似于我正在尝试做的事情吗?是的,这是一个协方差问题。如果您这样定义
IMammalRepository
:
public interface IMammalRepository<out T> where T : IMammal
{
// ...
}
公共接口IMammal存储库,其中T:IMammal
{
// ...
}
这会解决你的问题。是的,这是一个协方差问题。如果您这样定义
IMammalRepository
:
public interface IMammalRepository<out T> where T : IMammal
{
// ...
}
公共接口IMammal存储库,其中T:IMammal
{
// ...
}
这应该可以解决您的问题。查看Eric Lippert的博客。我想这是一个由十部分组成的系列。请查看Eric Lippert在上的博客。我想这是一个由十部分组成的系列。是的。我需要阅读更多关于协方差和逆方差的内容。谢谢,是的。我需要阅读更多关于协方差和逆方差的内容。谢谢