#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