2015-02-06 117 views
0

我有一種情況,我在運行時反映了一組屬性。當我得到實際的屬性值時,它僅僅是類型對象,但我做了檢查以確認它是一個通用List。在我的場景中,這些通用列表將始終包含某種類型的原始值(整數,字符串,長整型等)。有沒有一種簡單的方法將任何類型的List轉換爲字符串列表?像這樣:轉換列表<T>到列表<string>一般

object obj = pi.GetValue(item, null); 
Type type = obj.GetType(); 
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>)) { 
    List<string> lstStrings = ???; 
} 

或者我必須有一個大的switch語句並將其轉換爲適當的運行時List類型,然後將其轉換爲List?

感謝

+1

'Object.ToString' – 2015-02-06 22:02:07

+0

完全重寫了我的答案,請嘗試一下。 – 2015-02-06 22:47:56

回答

2

演員列表到非泛型類型。

IEnumerable運作良好,儘管在限制使用哪些方法之前,您只能將其設爲IEnumerable<T>。一旦你有一個IEnumerable<T>你可以使用ToString()將元素轉換爲字符串。

var list = ((IEnumerable)obj).OfType<object>(); 
List<string> strings = list.Select(x => x.ToString()).ToList(); 
+0

我想出了類似的解決方案,但在'OfType'之前找到'Cast'方法。不同之處在於'OfType'確實是過濾的。由於一切都是'對象',這工作正常。我想知道它是否會稍微增加運行時間?無論如何,檢查是否有物體可能是高度優化的。 – 2015-02-06 23:25:08

+0

@MichaelWelch我從性能的角度懷疑過濾是相關的。我之前因濫用Cast()而被燒燬,所以我通常堅持使用OfType(),因爲它具有額外的過濾空值的好處。 – 2015-02-06 23:35:37

+0

感謝有關'OfType'的信息。我其實從來沒有碰過它。 – 2015-02-06 23:37:16

1

在你的if語句中將obj轉換爲IEnumerable。你知道這是安全的,因爲它是一個List。然後你可以使用Enumerable靜態方法CastSelect

List<String> list = ((IEnumerable)obj).Cast<Object>().Select(x => x.ToString()); 
相關問題