从数组中获取实际类型

本文关键字:类型 获取 数组 | 更新日期: 2023-09-27 17:59:00

给定此示例:

IColor[] items;
items = new IColour[]{ new SomeColour() };

如何使用反射来查看项目,并获得typeof(SomeColour)而不是typeof(IColour)?根据我所熟悉的,typeof(items).GetElementType()给了我IColour,而不是实际的类型。

从数组中获取实际类型

你想要的是不可能的。数组可以存储多个项目,每个项目都有不同的具体类型。

数组的类型为IColor。存储在索引0处的项的类型为SomeColour。如果您向数组中添加了第二项:AnotherColour,该怎么办。items的类型应该是什么?

您可以使用items[index].GetType()获取存储在阵列中的项的类型,其中index指向阵列中的位置。

也许是这样?

foreach (var item in items)
{
    var t = item.GetType();
}

t应为SomerColur、OtherColur等。

typeof(items).GetElementType就是IColor,因为它是一个IColor列表。

要获得特定元素的底层类型:

IColor item = items[<someIdx>];
item.GetType();

如果你有一个IColor[],那么关于"实际类型",你只能说:IColor。例如,您可以有:

class Foo : IColor {...}
class Bar : IColor {...}

并且具有具有2个CCD_ 16和3个Bar的CCD_。现在:什么是"类型"?

如果数组不是空的,那么您可以查看第一项:

var type = items[0].GetType();

但如果数据是异构的,那也无济于事。你可以检查不同的类型,并希望它是同质的:

var type = items.Select(x => x.GetType()).Single();

这只是@Wouter de kort所说的一个例子

internal class Program
{
    private static void Main(string[] args)
    {
        IColour[] items;
        items = new IColour[] { new SomeColour(), new SomeOtherColour() };
        Console.WriteLine(items.GetType().GetElementType().Name);  // Will always return IColour
        foreach (var item in items)
        {
            Console.WriteLine(item.GetType().Name); // Will return the name of type added with the IColour interface
        }
        Console.ReadLine();
    }
}
internal interface IColour
{ }
internal class SomeColour : IColour
{ }
internal class SomeOtherColour : IColour
{ }