2011-06-22 8 views
20

Korzystając z odbicia, mam obiekt, który muszę wrzucić na listę elementów z możliwością iteracji (typ nieznany, będzie obiektem). Używając okna Watch widzę, że mój obiekt jest tablicą pewnego rodzaju, ponieważ informuje mnie o liczbie elementów i mogę rozbić widok drzewa, aby zobaczyć same elementy.Obiekt C# do tablicy

Najpierw muszę sprawdzić, czy przekazany obiekt jest jakimś rodzajem tablicy (może być List, może być obiektem [] itp.). Następnie muszę przetestować tę tablicę. Jednak nie mogę wykonać konwersji typu.

Oto jak używam go (w skrócie):

private static void Example(object instance, PropertyInfo propInfo) 
    { 
     object anArray = propInfo.GetValue(instance, null); 
     ArrayList myList = anArray as ArrayList; 
     foreach (object element in myList) 
     { 
      // etc 
     } 
    } 

Próbowałem różnymi odlewane. Powyższe nie powoduje wyjątku, ale moja lista ma wartość null, gdy anArray faktycznie istnieje i zawiera elementy. Zapisywana rzeczywista instancja jest mocno wpisaną listą <>, ale w razie potrzeby może przyjąć ograniczony podzbiór formularzy. Ale celem ćwiczenia jest to, że ta metoda Example() nie zna podstawowego typu właściwości.

+0

można dowiedzieć się, jaki rodzaj obiektu z instance.GetType() i można porównać go z rodzaju desirebale użyciem 'is', np 'if (instance.GetType() jest IEnumerable)' – Tsar

+1

@Bad Display Name, tak jak teraz działa słowo kluczowe *, to co robisz, próbuje przesłać z System.Type do System.Collection.IEnumerable, co robi nie działa, ponieważ System.Type nie implementuje tego interfejsu. być może miałeś na myśli ** typeof (IEnumerable) .IsAssignableFrom (instance.GetType()) ** – MattDavey

Odpowiedz

41

Casting go do ArrayList tylko będzie działać, jeśli obiekt jest rzeczywiście ArrayList. Nie działa na przykład z System.Array lub System.Collections.Generic.List`1.

myślę, co rzeczywiście należy zrobić, to rzucić go do IEnumerable, ponieważ jest jedynym wymogiem do pętli nad nim ...

object anArray = propInfo.GetValue(instance, null); 
IEnumerable enumerable = anArray as IEnumerable; 
if (enumerable != null) 
{ 
    foreach(object element in enumerable) 
    { 
     // etc... 
    } 
} 
+0

Wow, szybka praca i działa! Dzięki. – GeoffM

+1

Podziękowania dla innych. – GeoffM

14

Spróbuj rzucić na IEnumerable. Jest to najbardziej podstawowy interfejs wszystkich narzędzi przeliczalnych, tablic, list itd.

IEnumerable myList = anArray as IEnumerable; 
if (myList != null) 
{ 
    foreach (object element in myList) 
    { 
     // ... do something 
    } 
} 
else 
{ 
    // it's not an array, list, ... 
} 
1

Spróbuj tego:

var myList = anArray as IEnumerable; 
    if (mylist != null) 
    { 
     foreach (var element in myList) 
     { 
      // etc 
     } 
    } 

Zobacz także: trzeba określić rodzajowy rodzaj IEnumerable, w zależności od twojej sytuacji.

1

Powinieneś być w stanie obsłużyć go do IEnumerable, jeśli jest to kolekcja wszelkiego rodzaju (tablica, lista itp.). Również PropertyInfo zawiera właściwość PropertyType, której możesz użyć do ustalenia rzeczywistego typu, jeśli chcesz.

1

Wystarczy Try This

string[] arr = ((IEnumerable)yourOjbect).Cast<object>() 
          .Select(x => x.ToString()) 
          .ToArray();