2017-02-15 72 views
0

我需要字符串列表转换为对象的名单,但事情是我收到这个清单作为一个对象,因为它是一个参数,我不知道它是什么类型。C#转换对象列出<object>

这是接收参数的函数:

public static bool IsNotEmpty(object obj) 
{ 
    if (obj is ICollection) 
    { 
     IList<object> collection = (IList<object>)obj; // The cast throws error here 
     return IsNotEmpty(collection); 
    } 

    return true; 
} 

这是这一个使用一个:

public static bool IsNotEmpty<T>(IList<T> aList) 
{ 
    return aList != null && aList.IsNotEmpty(); 
} 

我能做些什么,以强制转换为对象的名单,所以那么我可以将它传递给另一个函数? (如果有一种方法)

+2

你为什么要IsNotEmptyString采取一个对象,而不是一个字符串? – EpicKip

+2

IsNotEmptyString是该功能的一个非常令人误解的名字 – BugFinder

+0

对不起,我改变了功能,所以我可以在这里显示它! 现在它实际上转换为字符串列表。 – Tobi

回答

2
public static bool IsNotEmpty(object obj) 
    { 
     var collection = obj as ICollection; 
     return collection == null || collection.Count > 0; 
    } 
8

你在做什么,我们所说的“XY问题”:你心里有一个(错误)解决方案为您的问题,你问你的错误的解决方法,而不是寻求解决你的实际问题。

你并不需要字符串列表转换为对象的名单摆在首位,所以没有必要问该怎么做。对您的问题的正确解决方案是:

static class MyExtensions 
{ 
    public static bool Any(this IEnumerable sequence) 
    { 
    if (sequence == null) 
     throw new ArgumentNullException ... etc ... 
    if (sequence is ICollection) 
     return ((ICollection)sequence).Any(); 
    foreach(object item in sequence) 
     return true; 
    return false; 
    } 
    public static bool Any(this ICollection collection) 
    { 
     if (collection == null) blah blah blah 
     return collection.Count > 0; 
    } 
} 

很好。现在你的方法是:

public static bool IsNotEmpty(object obj) 
{ 
    if (obj is IEnumerable) 
    return ((IEnumerable)obj).Any(); 
    else 
    return true; 
} 

这里的想法是首先去收集,因为这样可以避免不必要地枚举序列。这可能很昂贵。但是如果我们有一个包含项目但不是集合的序列,则列举它的第一个元素。如果我们能够成功地做到这一点,那么它就不是空的;如果我们不能,那么它是空的。

但更一般地说:您的方法的签名是不幸的。如果可以避免的话,不要陷入第一时间手头有object的情况。你是怎么进入这种情况的?

+1

最后一段是我认为最重要的一段。我真的很想知道为什么OP有一个'object'而不是某种类型的集合来处理。我怀疑这是真正应该解决的问题。 – TheInnerLight

+0

如果使用as-IsNotEmpty将会变短 –