2010-07-07 15 views
11
FieldInfo[] fields = typeof(MyDictionary).GetFields(); 

MyDictionary jest klasą statyczną, wszystkie pola są tablicami ciągów.C# Reflection: jak uzyskać wartości i długość tablicy?

Jak uzyskać wartość Length każdej tablicy, a następnie przejrzeć wszystkie elementy? Próbowałem obsady jak:

field as Array 

ale powoduje błąd

nie można przekonwertować typu „System.Reflection.FieldInfo” do „System.Array” poprzez konwersję odniesienia, boks konwersji, unboxing konwersji owijania konwersji lub null konwersja typu

+0

co dokładnie chcę zrobić ? –

+0

Potrzebuję do iteracji przez wszystkie elementy tablicy, aby sprawdzić, czy niektóre wartości istnieją w jakiejkolwiek tablicy – Tony

Odpowiedz

9

Edit po edycji: Należy pamiętać, że to, co ja s obiekty odbicia, a nie obiekty lub wartości związane z twoją własną klasą. Innymi słowy, te obiekty FieldInfo, które tam masz, są wspólne dla wszystkich instancji twojej klasy. Jedynym sposobem dotarcia do tablic ciągów jest użycie tych obiektów FieldInfo, aby uzyskać wartość pola określonej instancji klasy.

W tym celu należy użyć FieldInfo.GetValue. Zwraca wartość pola jako obiektu.

Skoro wiesz już są tablice ciąg znaków, który upraszcza rzeczy:

Jeśli pola są statyczne, przechodzą null parametru obj poniżej.

foreach (var fi in fields) 
{ 
    string[] arr = (string[])fi.GetValue(obj); 
    ... process array as normal here 
} 

Jeśli chcesz, aby zapewnić Ci tylko pola procesowe z tablicami ciąg znaków:

foreach (var fi in fields) 
{ 
    if (fi.FieldType == typeof(string[])) 
    { 
     string[] arr = (string[])fi.GetValue(obj); 
     ... process array as normal here 
    } 
} 
+0

OK, ale w tym przypadku I pressume "obj" byłoby instancją klasy MyDictionary, ale nie mogę utworzyć wystąpienia tego klasa, ponieważ jest to statyczna klasa – Tony

+0

Po prostu przekazuj zero dla obj, nie przeczytałem dokładnie twojego pytania :) –

+0

@ Tony po prostu przekazuje null zamiast obj –

4

Jak to:

FieldInfo[] fields = typeof(MyDictionary).GetFields(); 
foreach (FieldInfo info in fields) { 
    string[] item = (string[])info.GetValue(null); 
    Console.WriteLine("Array contains {0} items:", item.Length); 
    foreach (string s in item) { 
    Console.WriteLine(" " + s); 
    } 
} 
8

Jako przykład:

using System; 
using System.Reflection; 

namespace ConsoleApplication1 
{ 
    public static class MyDictionary 
    { 
     public static int[] intArray = new int[] { 0, 1, 2 }; 
     public static string[] stringArray = new string[] { "zero", "one", "two" }; 
    } 

    static class Program 
    { 
     static void Main(string[] args) 
     { 
      FieldInfo[] fields = typeof(MyDictionary).GetFields(); 

      foreach (FieldInfo field in fields) 
      { 
       if (field.FieldType.IsArray) 
       { 
        Array array = field.GetValue(null) as Array; 

        Console.WriteLine("Type: " + array.GetType().GetElementType().ToString()); 
        Console.WriteLine("Length: " + array.Length.ToString()); 
        Console.WriteLine("Values"); 
        Console.WriteLine("------"); 

        foreach (var element in array) 
         Console.WriteLine(element.ToString()); 
       } 

       Console.WriteLine(); 
      } 

      Console.Readline(); 
     } 
    } 
} 
Powiązane problemy