Чтение массива структуры, инкапсулированного в Object в c # - PullRequest
2 голосов
/ 27 мая 2011

Я использую отражение для обработки сборки, загруженной во время выполнения.Моя проблема в том, что один из методов имеет выходной параметр, который содержит массив структур.

Вот объявления из сборки:

public struct WHATEVER
{
}

public class SOMECLASS
{
    public static int methodCall(out WHATEVER[] ppWhateverStructs);
}

И вот как я пытался выполнить:

Type tWHATEVER = Assembly.Load("path-to-Assembly").GetType("WHATEVER");
Type tSOMECLASS = Assembly.Load("path-to-Assembly").GetType("SOMECLASS");

Array objStructs = Array.CreateInstance(tWHATEVER, 1);
object[] Params = new object[] { @objStructs };             // tried with and without "@" - same thing

MethodInfo method = tSOMECLASS.GetMethod("methodCall", new Type[] { tWHATEVER.MakeArrayType().MakeByRefType() });
retVal = method.Invoke(null, Params);

когда я помещаю «Params» в окно просмотра, оно показывает, что оно содержит массив из 1 элемента, который также содержит массив N-размера, заполненный элементами, и objStructs не изменяется.Это правильно.Моя проблема в том, что я не знаю, как выбрать элементы из подмассива:

object objRestuls = Params[0];

Это утверждение работает, показывает элементы, которые я ожидаю в окне наблюдения, но я не знаю, как перебирать изабрать их с объекта.Когда я пытаюсь это сделать:

object [] objRestuls = (object [])Params[0];

Выдается следующее исключение:

An unhandled exception of type 'System.InvalidCastException' occurred in TestAssembly.dll

Additional information: Unable to cast object of type 'TestAssembly.WHATEVER[]' to type 'System.Object[]'.

У кого-нибудь есть подсказка о том, как читать массив-структуру, инкапсулированный в объект?

Ответы [ 2 ]

2 голосов
/ 27 мая 2011

Вы можете использовать:

Array array = (Array) Params[0];

, а затем выполнить итерацию по нему, используя элементы Array или даже используя foreach (который будет упаковывать каждый элемент).

причина, по которой он в настоящее время не работает, состоит в том, что массив значений типа значения не массив ссылок - так что это даже не скомпилируется:

// Invalid
object[] array = new int[10];
1 голос
/ 27 мая 2011

Вы пробовали TestAssembly.WHATEVER w0 = (TestAssembly.WHATEVER)Params[0][0]?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...