将通用IList转换为子类型数组

时间:2017-11-15 11:04:52

标签: c# arrays generics covariance

(请不要问为什么我这样做 - 我与一些遗留代码接口)

我有一个IList<Animal>,我想将它转换为动物子类型的数组(例如Leopard),但子类型在编译时是未知的 - 它已通过作为参数。

[编辑:保证列表只包含豹子]

我找到了一种有效的方法:

var myArray = (object[])new ArrayList(animals.ToList()).ToArray(animalType)

然后,调用者将myArray强制转换为Leopard[]

有更好的解决方案吗?

2 个答案:

答案 0 :(得分:0)

试试这个:

Animal[] animalArray = new Animal[animals.Count];
animals.CopyTo(animalArray, 0);

答案 1 :(得分:0)

这是你的意思吗?

public class Animal
{
    public string Name { get; set; }
}

public class Leopard : Animal
{
}

class Program
{
    static void Main(string[] args)
    {
        var animals = new List<Animal>
        {
            new Leopard { Name = "Bob" },
            new Leopard { Name = "Jeff" },
            new Leopard { Name = "Bill" },
            new Leopard { Name = "Dave" }
        };

        Leopard[] leopardArray = new Leopard[animals.Count];
        animals.CopyTo(leopardArray, 0);

        Console.Write(leopardArray.Count());
    }
}