2013-03-25 111 views
2

我有以下列表:轉換列表給定類型

public List<EntityBase> PossibleReplacements 

我也有一個類型

public Type type; 

類型將包含繼承EntityBase某一類類型(那怎麼我​​的應用程序作品)。 現在我需要轉換列表PossibleReplacements類型爲「類型」

像這樣的列表:

List<type> lijst = PossibleReplacements.Cast<type>(); 

但是這給出了一個錯誤

'ReplacePopupModel.type' is a 'field' but is used like a 'type' 

我還沒有找到一個爲此工作的解決方案。

任何人都可以幫我嗎?

謝謝。

+1

當您調用Cast <>時嘗試typeof(type)。 – 2013-03-25 16:54:15

+3

你不能以類型安全的方式做到這一點,你的類型在編譯時不知道 – Vasea 2013-03-25 16:56:57

+0

似乎更像是一般對泛型缺乏理解。你想用列表做什麼? – 2013-03-25 17:13:51

回答

1

不能使用Cast,因爲它不是類型安全運行時,你只需要使用where選擇:

var lijst = PossibleReplacements.Where(t => t.GetType() == type); 
+0

他不想獲取類型,OP想要投射到給定的類型實例。 – Matten 2013-03-25 16:55:41

+0

@Matten:是的,我更正了我的回答 – 2013-03-25 16:57:30

+0

Convert.ChangeType在運行時會失敗...另外,由於Select將從此查詢中返回IEnumerable ',因此無法編譯。 – 2013-03-25 16:57:47

1

你可以得到的物品了那場比賽的種類等的這樣:

List<EntityBase> list = PossibleReplacements.Where(e => type.IsAssignableFrom(e.GetType())).ToList(); 

此列表將只包含與您在type中指定的特定類型相匹配的項目(或其子類)。

但是,您不能投射到特定的List<T>類型,因爲這在編譯時是未知的。

如果你正在試圖提取在編譯時已知的特定類型的的項目,你可以用:

List<TheType> list = PossibleReplacements.OfType<TheType>().ToList(); 
1

不是沒有反映,而不是安全。但是你可以按照裏德Copseys第一個暗示,並檢查是否所有條目都分配給你的類型,然後使用反射的投法:

var type = ...your type... 

var cast = typeof(IEnumerable<>).GetMethod("Cast").MakeGenericMethod(type); 
var list = cast.Invoke(PossibleReplacements, null); 

變量list現在object,但到右側列表的引用類型。由於您不知道您的實際類型,因此您可能有一些訪問列表的界面(需要強制轉換)。