给出这个例子:
IColor[] items;
items = new IColour[]{ new SomeColour() };
如何使用反射来查看项目,并获取typeof(SomeColour)
而不是typeof(IColour)
?使用我熟悉的内容,typeof(items).GetElementType()
会给我IColour
,而非实际类型。
答案 0 :(得分:5)
你要求的是不可能的。您的数组可以存储多个项目,每个项目具有不同的具体类型。
您的数组类型为IColor
。存储在索引0处的项目类型为SomeColour
。如果您向阵列中添加了第二项,该怎么办:AnotherColour
。 items
的类型应该是什么?
您可以使用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
{ }