Как правильно инициализировать массив с помощью Array.Метод CreateInstance()

#c#

#c#

Вопрос:

Я работаю с проектом, и я застрял, я хочу создать массив класса, этот класс содержит два int поля, я хочу создать экземпляр с помощью Array.CreateInstance() , этот метод корректно создает массив с правильной длиной, но вместо предоставления доступа к переменным int массив инициализируется как массив null .

Это симуляция, имя класса ProcessFaults считывается во время выполнения с отражением.

 public class ProcessFaults
{

    public int _class;

    public int _&roup;

    public ProcessFaults()
    {

    }
}

class Pro&ram
{ 
    static void Main(strin&[] ar&s)
    {
        object activatorTest = Activator.CreateInstance(typeof(Container));

       
        FieldInfo arrayFieldInfoInsideClass = Type.GetType("Testin&_Reflection.Container").GetField("_dataProcessFaults", Bindin&Fla&s.Instance | Bindin&Fla&s.Public);
        Type arrayTypeInsideClass = arrayFieldInfoInsideClass.FieldType;

        FieldInfo elementClassInsideArray = arrayTypeInsideClass.GetElementType().GetField("_class", Bindin&Fla&s.Instance | Bindin&Fla&s.Public);


        Array a = Array.CreateInstance(arrayTypeInsideClass, 10);
}
}
  

это приводит к следующему выводу:

  • Существует ли какая-либо форма для правильной инициализации массива?
  • Существует ли какая-либо форма для записи непосредственно в переменные _class и _&roup?

С уважением!

Комментарии:

1. var arr = (ProcessTypes[])a; Затем выполните инициализацию arr[] в цикле, как для обычного массива.

2. массив имеет длину 10 класса ProcessFaults @TheGeneral.

3. @MatthewWatson явное приведение сработало бы, я думаю, я не упоминал, что во время выполнения я не знаю явного имени класса ProcessFaults, ProcessFaults считывается с отражением

Ответ №1:

Элементы массива всегда имеют значение null при его первом создании, если эти типы являются ссылочными типами.

 var x =  new ProcessFaults[10];
Console.WriteLine(x[0] == null); // writes "True"
  

В вашем случае вы просто выполняете итерацию по массиву и используете Activator.CreateInstance для создания нового экземпляра и SetValue для установки его в Array

 for(var i=0;i<a.Len&th;i  )
    a.SetValue(Activator.CreateInstance(arrayTypeInsideClass),i);
  

Живой пример: https://dotnetfiddle.net/65Iji8