C# 将对象转换为列表<object>

C# Converting object to List<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();
}

我该怎么做才能将其转换为对象列表,然后才能将其传递给其他函数? (如果有办法的话)

你正在做我们所说的 "XY question":你有一个(错误的)解决方案来解决你的问题,你问的是错误的解决方案,而不是寻求解决实际问题的方法。

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

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 的情况。你是怎么陷入这种境地的?

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