A po co tak utrudniasz sobie życie?
Dlatego, że wykorzystuję refleksję, aby pobrać listę wszystkich metod z zewnętrznej biblioteki (mogą mieć różną ilość argumentów), a następnie przy pomocy dokumentacji zdeserializowanej z xml do listy obiektów utworzonych za pomocą xsd.exe tworzę tablicę obiektów, które zawierają parametry przekazywane do funkcji wywoływanej przez invoke.
Spróbuj zrzutować na typ docelowy za pomocą operatora as
, jeśli się uda, czyli wynikiem nie będzie null
, to po prostu odwołaj się do elementu jak w normalnej tablicy:
Kopiuj
var tablicaDouble = args[k] as double[];
if (tablicaDouble != null)
{
var mójElement = tablicaDouble[666];
}
Niestety, w takiej sytuacji zakładam, że jest to tablica double (a może być również tablicą int).
Aktualnie utworzyłem coś takiego:
Kopiuj
for (int j = 0; j < Convert.ToInt32(args[firstOutputArg+1]); j++)
{
for (int k = firstArrayOutputArg; k < nrOfObjects; k++)
{
Type arrayType = args[k].GetType();
if (arrayType == typeof (System.Double[]))
{
var doubleArray = (double[]) args[k];
file.Write(doubleArray[j]);
}
else if (arrayType == typeof(System.Int32[]))
{
var intArray = (int[]) args[k];
file.Write(intArray[j]);
}
}
}
Powyższy kod się kompiluje (za chwilę sprawdzę, czy działa poprawnie), ale nawet jeśli zadziała to jego wydajność będzie bardzo niska (dla każdej iteracji od nowa muszę tworzyć całą tablicę poprzez jej rzutowanie na double[] lub int[].
Docelowo chcę, aby ostatnich kilka elementów głównej tablicy args zostało przepisanych do pliku csv, gdzie konkretna tablica to konkretna kolumna w csv (w invoke kilka tablic jest przekazywanych jako parametry, które wywołana funkcja modyfikuje, ponieważ tablice są zawsze przekazywane przez referencję).