簡體   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