2016-12-23 2 views
0

Я хотел бы определить метод, который принимает массив как параметр, но этот массив может иметь любой ранг. Ранг будет определен отдельным параметром. Что-то, чтобы заменить/обобщают следующее:C#: Есть ли способ определить параметр массива метода нестандартного ранга?

// one dimensional array 
public void WorkOnJaggedArray<T>(int rank, int[] dimensions, T[] data) 
{ 
    /* code */ 
} 

// two dimensional array 
public void WorkOnJaggedArray<T>(int rank, int[] dimensions, T[][] data) 
{ 
    /* code */ 
} 

// three dimensional array 
public void WorkOnJaggedArray<T>(int rank, int[] dimensions, T[][][] data) 
{ 
    /* code */ 
} 

// and so on... 

Учитывая, что у меня есть ранг и размер каждого измерения прошедшего, я должен быть в состоянии обобщить код внутри моего метода. Есть ли хороший способ добиться того, о чем я прошу?

+0

К сожалению, нет. Я упростил свой вопрос здесь, но это будет частью более крупного API, и «данные» должны быть переданы таким образом. – mbadawi23

+0

Я в замешательстве. Почему бы вам не использовать 'params'? – Eris

+0

Мне непонятно, как «params» можно использовать здесь для моей проблемы. Вызывающий метод должен отправить в один * неровный массив *, а не список переменных параметров. – mbadawi23

ответ

2

Вы можете использовать «System.Array» для управления параметрами любого ранга:

Создание экземпляра массива с помощью вызова Array.CreateInstance.

Это даст вам экземпляр класса Array. Вызов SetValue для назначения значений вашему массиву. Используйте GetValue для извлечения любых элементов массива.

 public void WorkOnJaggedArray<T>(int rank, int[] dimensions, Array data) 
{ 
    /* code */ 
} 
+0

Моя проблема не определяет размерность массива. Моя проблема заключается в определении общего параметра метода. – mbadawi23

+0

@ mbadawi23: с помощью этой сигнатуры метода вы можете передать строку ']' или 'string [] []' или любой другой массив, как вы хотите. Если вы знаете ранг массива, то ваш код может использовать его для извлечения соответствующих данных. О, хотя я заметил, что это было недавно отредактировано, и старый ответ был не так полезен. Но да, это должно делать эту работу сейчас. :) – Chris