С# Reflection: как получить значения массива и длину?
FieldInfo[] fields = typeof(MyDictionary).GetFields();
MyDictionary
является статическим классом, все поля являются строковыми массивами.
Как получить значение Length для каждого массива, а затем повторить все элементы?
Я попробовал бросок, как:
field as Array
но вызывает ошибку
Невозможно преобразовать тип 'System.Reflection.FieldInfo' в 'System.Array' через ссылочное преобразование, преобразование бокса, преобразование распаковки, конвертирование конверсий или преобразование нулевого типа
Ответы
Ответ 1
Изменить после редактирования. Обратите внимание, что у вас есть объекты отражения, а не объекты или значения, связанные с вашим собственным классом. Другими словами, те объекты 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
}
}
Ответ 2
В качестве примера:
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();
}
}
}
Ответ 3
Вот так:
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);
}
}