C#反思:如何获得数组值&长度?

时间:2010-07-07 11:35:54

标签: c# reflection

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

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

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

field as Array

但是会导致错误

  

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

3 个答案:

答案 0 :(得分:10)

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

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

由于您已经知道它们是字符串数组,因此简化了事情:

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

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

答案 1 :(得分:9)

举个例子:

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

答案 2 :(得分:4)

像这样:

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