我在外部类(class)中有以下方法

public static void DoStuffWithAnimals(IDictionary<string, Animal> animals)

在我的调用代码中,我已经有一个Dictionary<string, Lion>对象,但是我不能将其作为此方法的参数传入。那么IDictionary<,>是不是协变的?我看不出任何不起作用的原因。

我能想到的唯一解决方案是:
var animals = new Dictionary<string, Animal>();

foreach(var kvp in lions) {
    animals.Add(kvp.Key, kvp.Value);
}

有没有办法在不必创建相同对象的新字典的情况下将此字典传递给此方法?

编辑:

因为这是我的方法,所以我知道从字典中使用的唯一成员是TValue this[TKey key]的getter,它是IDictionary<TKey, TValue>的成员,因此在这种情况下,我无法为参数使用“更广泛的”类型。

最佳答案

在解决方案方面,您可以执行以下操作,只需传入访问器即可:

    public static void DoStuffWithAnimals(Func<string, Animal> getAnimal)
    {
    }

    var dicLions = new Dictionary<string, Lion>();
    DoStuffWithAnimals(s => dicLions[s]);

显然,这可能会满足您的需求,但是如果您只需要几个字典方法,就很容易做到这一点。

这是让您在动物之间重用一些代码的另一种方式:
    public class Accessor<T> : IAnimalAccessor where T : Animal
    {
        private readonly Dictionary<string, T> _dict;

        public Accessor(Dictionary<string, T> dict)
        {
            _dict = dict;
        }

        public Animal GetItem(String key)
        {
            return _dict[key];
        }
    }

    public interface IAnimalAccessor
    {
        Animal GetItem(string key);
    }

    public static void DoStuffWithAnimals(IAnimalAccessor getAnimal)
    {
    }

    var dicLions = new Dictionary<string, Lion>();
    var accessor = new Accessor<Lion>(dicLions);
    DoStuffWithAnimals(accessor);

10-08 15:57