C#将对象转换为List <object>

时间:2017-02-15 14:01:21

标签: c# list ienumerable icollection

我需要将字符串列表转换为对象列表,但问题是我接收此列表作为对象,因为它是一个参数,我不知道它是什么类型。

这是接收参数的函数:

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 个答案:

答案 0 :(得分:8)

你正在做我们称之为&#34; XY问题&#34;:你有一个(错误的)解决方案,因为你的问题并且你正在询问你的错误解决方案,而不是寻求你的解决方案实际问题。

您首先不需要将字符串列表转换为对象列表,因此无需询问如何执行此操作。解决问题的正确方法是:

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 :(得分:3)

    public static bool IsNotEmpty(object obj)
    {
        var collection = obj as ICollection;
        return collection == null || collection.Count > 0;
    }
相关问题