2015-05-27 48 views
1

我有一個不同類型的列表。類具有共同的基類和一個公共接口:如何在運行時確定變量的類型

public List<IColumn> columnTypes = new List<IColumn> 
     {   
     new Column1(), 
     new Column2(), 
     new Column3() 
     }; 

現在我需要一個變量c:

c = columnTypes[x]; 

,其中x是在運行時確定的,並且因此Ç將具有其類型在運行時確定。 我該怎麼做?

+0

您可以使用反射 – Coder1409

+0

'columnTypes [X] .GetType()'? –

+1

如果你正在抽象接口,那麼爲什麼需要使用實現細節?似乎你的設計可以改進。 – Maarten

回答

1

爲什麼不使用接口類型

IColumn c = columnTypes[x]; 

的變量,如果您的類型不完全實現接口IColumn
可以使用columnTypes[x].GetType()但是這將需要一些額外的編碼

0
var c = columnTypes[x]; 

c.GetType()將爲您提供Type對象,並提供您需要的所有信息:here是一個概述。

3

您有一個接口(IColumn)......你應該從該接口使用Column*

IColumn c = columnTypes[x]; 

c.Foo(); // where Foo is a method defined in IColumn and implemented in Column* 

如果你願意,你可以:

Column1 c1 = c as Column1; 

if (c1 != null) 
{ 
    c1.SpecificFooC1(); // "special" method of Column1 
} 

if (c1 is Column1) 
{ 
    // Here we were only interested in knowing if c1 was Column1 
} 
+0

如果他實現了他需要使用的接口之外的其他方法,則不起作用 – Coder1409

+0

@ Coder1409有一個例子與第二個例子完全相同。 – xanatos

+0

他只是可以使用反射這一點,不要爲什麼反射給人們的毛骨悚然,你100%確定它的工作原理 – Coder1409