0

给定这个例子:

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

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

4

5 回答 5

5

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

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

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

于 2013-02-14T11:41:31.650 回答
1

也许这个?

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

t 应该是 SomeColur、OtherColur 等。

于 2013-02-14T11:50:04.157 回答
0

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

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

IColor item = items[<someIdx>];
item.GetType();
于 2013-02-14T11:41:58.940 回答
0

如果你有一个IColor[],那么关于“实际类型”你唯一能说的就是:IColor。例如,您可以:

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

并有一个包含 2和 3的IColor[]数组。现在:什么是“类型”?FooBar

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

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

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

var type = items.Select(x => x.GetType()).Single();
于 2013-02-14T11:42:15.553 回答
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
{ }
于 2013-02-14T11:56:04.707 回答