[英]Get actual type from array
給出以下示例:
IColor[] items;
items = new IColour[]{ new SomeColour() };
如何使用反射來查看項目,並獲得typeof(SomeColour)
而不是typeof(IColour)
? 使用我熟悉的類型, typeof(items).GetElementType()
給我IColour
,而不是實際類型。
您所要求的是不可能的。 您的數組可以存儲多個項目,每個項目都有不同的具體類型。
數組的類型為IColor
。 存儲在索引0處的項目的類型為SomeColour
。 如果將第二個項目添加到數組AnotherColour
: AnotherColour
。 items
的類型應該是什么?
您可以使用items[index].GetType()
獲得存儲在數組中的項目的類型,其中index
指向數組中的位置。
也許這個嗎?
foreach (var item in items)
{
var t = item.GetType();
}
t應該是SomeColur,OtherColur等。
typeof(items).GetElementType
是IColor
,因為它是IColor
的列表。
要獲取基礎類型的特定元素:
IColor item = items[<someIdx>];
item.GetType();
如果您具有IColor[]
,那么關於“實際類型”只能說的是: IColor
。 例如,您可能有:
class Foo : IColor {...}
class Bar : IColor {...}
並具有一個帶有2 Foo
和3 Bar
的IColor[]
數組。 現在:什么是“類型”?
如果數組是非空的,則可以看一下第一項:
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.