繁体   English   中英

从数组获取实际类型

[英]Get actual type from array

给出以下示例:

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

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

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

数组的类型为IColor 存储在索引0处的项目的类型为SomeColour 如果将第二个项目添加到数组AnotherColourAnotherColour items的类型应该是什么?

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

也许这个吗?

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

t应该是SomeColur,OtherColur等。

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

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

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

如果您具有IColor[] ,那么关于“实际类型”只能说的是: IColor 例如,您可能有:

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

并具有一个带有2 Foo和3 BarIColor[]数组。 现在:什么是“类型”?

如果数组是非空的,则可以看一下第一项:

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
{ }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM