Отражение C#: как получить массив значения и длина?

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

MyDictionary статический класс, все поля являются массивами строк.

Как добраться, получают значение Длины каждого массива и затем itearate через все элементы? Я попробовал бросок как:

field as Array

но это вызывает ошибку

Не может преобразовать тип 'Система. Отражение. FieldInfo' к 'Системе. Массив' через ссылочное преобразование, упаковывая преобразование, распаковывая преобразование, перенося преобразование или пустое преобразование типов

13
задан Andreas Niedermair 10 December 2015 в 12:43
поделиться

3 ответа

Редактирование после вашего редактирования: Обратите внимание, что то, что у вас есть - это объекты отражения, а не объекты или значения, относящиеся к вашему собственному классу. Другими словами, те объекты 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
    }
}
11
ответ дан 1 December 2019 в 21:51
поделиться

Как пример:

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();
        }
    }
}
9
ответ дан 1 December 2019 в 21:51
поделиться

Примерно так:

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);
  }
}
4
ответ дан 1 December 2019 в 21:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: