从数组中获取实际类型

时间:2013-02-14 11:38:43

标签: c# arrays generics reflection

给出这个例子:

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

如何使用反射来查看项目,并获取typeof(SomeColour)而不是typeof(IColour)?使用我熟悉的内容,typeof(items).GetElementType()会给我IColour,而非实际类型。

5 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:1)

也许这个?

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

应该是SomeColur,OtherColur等。

答案 2 :(得分:0)

typeof(items).GetElementType IS IColor,因为它是IColor的列表。

获取基础类型的特定元素:

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

答案 3 :(得分:0)

如果您有IColor[],那么您对“实际类型”的唯一说法就是:IColor。例如,您可以:

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

并且IColor[]数组包含2个Foo和3个Bar。现在:什么是“类型”?

如果数组非空,您可以查看第一项:

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

但如果数据是异构的,这将无济于事。您可以检查 distinct 类型,并希望它是同质的:

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

答案 4 :(得分:0)

这只是@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
{ }