Muszę przekonwertować listę łańcuchów do listy obiektów, ale to jest to, że otrzymuję tę listę jako obiekt, ponieważ jest to parametr i nie wiem, jaki jest typ.

Jest to funkcja, która odbiera parametr:

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;
}

I to jest ten, który używa:

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

Co mogę zrobić, aby rzucić go jako listę obiektów, więc mogę przekazać go drugiej funkcji? (Jeśli jest sposób)

2
tobi 15 luty 2017, 17:01

2 odpowiedzi

Najlepsza odpowiedź
    public static bool IsNotEmpty(object obj)
    {
        var collection = obj as ICollection;
        return collection == null || collection.Count > 0;
    }
4
Alexander Egorov 15 luty 2017, 14:29

Robisz to, co nazywamy "pytaniem XY": masz na uwadze (zły) rozwiązanie dla twojego problemu i pytasz o twoje złe rozwiązanie, a nie szukanie rozwiązania rzeczywistego problemu.

Nie musisz konwertować listy ciągów do listy obiektów w pierwszej kolejności, więc nie ma potrzeby pytania, jak to zrobić. Właściwe rozwiązanie problemu jest:

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;
   }
}

Wspaniały. Teraz twoja metoda jest:

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

Pomysł jest tutaj, aby najpierw przejść do kolekcji, ponieważ niepotrzebnie uniknięcie wyliczenia sekwencji. To może być drogie. Ale jeśli mamy sekwencję, która ma przedmioty, ale nie jest kolekcją, wylicz swój pierwszy element. Jeśli możemy to zrobić z powodzeniem, to nie jest puste; Jeśli nie możemy, to jest pusty.

Ale ogólnie ogólnie: podpis twojej metody jest niefortunna. Nie wchodź do sytuacji, w której masz w pierwszej kolejności object, jeśli można go uniknąć. Jak dostałeś się do tej sytuacji?

8
Eric Lippert 15 luty 2017, 14:24