C#反思:如何获取数组值和长度?

FieldInfo[] fields = typeof(MyDictionary).GetFields(); 

MyDictionary是一个静态类,所有字段都是字符串数组。

如何获取每个数组的Length值,然后遍历所有元素? 我尝试了演员:

 field as Array 

但它会导致错误

无法通过引用转换,装箱转换,拆箱转换,换行转换或空类型转换将类型’System.Reflection.FieldInfo’转换为’System.Array’

编辑后编辑 :请注意,您拥有的是reflection对象,而不是与您自己的类相关的对象或值。 换句话说,您拥有的那些FieldInfo对象对于您的类的所有实例都是通用的。 获取字符串数组的唯一方法是使用这些FieldInfo对象来获取类的特定实例的字段值。

为此,您使用FieldInfo.GetValue 。 它将字段的值作为对象返回。

既然你已经知道它们是字符串数组,那就简化了:

如果字段是静态的,则为下面的obj参数传递null

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

如果您想确保只处理字符串数组的字段:

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

举个例子:

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

像这样:

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