使用泛型进行类型转换

时间:2013-04-15 21:22:57

标签: c# generics

假设我有一个具体的类 - '长颈鹿'实现'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&lt;&gt; (第一个)编译?这是一个协方差的事吗?接下来,任何想法我如何能够完成类似于我想做的事情?

2 个答案:

答案 0 :(得分:3)

是的,这是一个协方差的事情。如果你这样定义IMammalRepository

public interface IMammalRepository<out T> where T : IMammal
{
    // ...
}

这可以解决您的问题。

答案 1 :(得分:0)

posts上查看Eric Lippert的博客Covariance and Contravariance。这是我认为的十部分系列。