给定这个例子:
IColor[] items;
items = new IColour[]{ new SomeColour() };
如何使用反射来查看项目,并获取typeof(SomeColour)
而不是typeof(IColour)
?使用我熟悉的,typeof(items).GetElementType()
给我IColour
,而不是实际的类型。
给定这个例子:
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 应该是 SomeColur、OtherColur 等。
typeof(items).GetElementType
IS IColor
,因为它是 IColor 的列表。
要获取特定元素的底层类型:
IColor item = items[<someIdx>];
item.GetType();
如果你有一个IColor[]
,那么关于“实际类型”你唯一能说的就是:IColor
。例如,您可以:
class Foo : IColor {...}
class Bar : IColor {...}
并有一个包含 2和 3的IColor[]
数组。现在:什么是“类型”?Foo
Bar
如果数组非空,您可以查看第一项:
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
{ }