2015-02-06 121 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()); 
相关问题