将对象转换为集合
本文关键字:集合 转换 对象 | 更新日期: 2023-09-27 18:00:14
我有一种情况,我得到了一个对象,需要:
- 确定该对象是单个对象还是集合(数组、列表等)
- 如果它是一个集合,请遍历列表
到目前为止我所拥有的。IEnumerable测试不起作用。并且到IEnumerable的转换仅适用于非基元类型。
static bool IsIEnum<T>(T x)
{
return null != typeof(T).GetInterface("IEnumerable`1");
}
static void print(object o)
{
Console.WriteLine(IsIEnum(o)); // Always returns false
var o2 = (IEnumerable<object>)o; // Exception on arrays of primitives
foreach(var i in o2) {
Console.WriteLine(i);
}
}
public void Test()
{
//int [] x = new int[]{1,2,3,4,5,6,7,8,9};
string [] x = new string[]{"Now", "is", "the", "time..."};
print(x);
}
有人知道怎么做吗?
检查对象是否可转换为非通用IEnumerable
接口就足够了:
var collection = o as IEnumerable;
if (collection != null)
{
// It's enumerable...
foreach (var item in collection)
{
// Static type of item is System.Object.
// Runtime type of item can be anything.
Console.WriteLine(item);
}
}
else
{
// It's not enumerable...
}
IEnumerable<T>
本身实现IEnumerable
,因此这将适用于泛型和非泛型类型。使用此接口而不是通用接口可以避免通用接口差异的问题:IEnumerable<T>
不一定可以转换为IEnumerable<object>
。
这个问题更详细地讨论了通用接口差异:C#4.0 中的通用差异
不要使用IEnumerable
的通用版本
static void print(object o)
{
Console.WriteLine(IsIEnum(o)); // Always returns false
var o2 = o as IEnumerable; // Exception on arrays of primitives
if(o2 != null) {
foreach(var i in o2) {
Console.WriteLine(i);
}
}
}
如果这样做,您将错过一些可以在foreach
中使用的类型。可以用作foreach
中集合的对象不需要实现IEnumerable
,只需要实现GetEnumerator
,后者反过来需要返回具有Current
属性和MoveNext
方法的类型
如果集合是键入的,并且您只需要支持不同类型的集合,则可以进行
static void print<T>(T o) {
//Not a collection
}
static void print<T>(IEnumerable<T> o) {
foreach(var i in o2) {
Console.WriteLine(i);
}
}
在这种情况下,方法重载解析将根据对象是否是集合(在本例中是通过实现IEnumerable<T>
定义的)
使用以下代码:
Type t = typeof(System.Collections.IEnumerable);
Console.WriteLine(t.IsAssignableFrom(T)); //returns true for collentions