Как извлечь элементы массива в тип объекта в C #? - PullRequest
1 голос
/ 18 августа 2011

У меня есть объект, который содержит массив любого типа (не априорно известного типа. Поэтому я не могу выполнить простое приведение кода, потому что могу определить тип только во время выполнения!) , Как я могу извлечь содержимое массива? Например:

int[] array = new int[] { 0, 1, 2 };
object obj=array;
...
//Here I know that obj is an array (<b>of a priory unknown type and I cannot use type conversion in the code </b> 
//How can extract elements of obj and use them, e.g. write them on the screen?`

Ответы [ 6 ]

10 голосов
/ 18 августа 2011

Массив представляет собой IEnumerable<T>, с использованием ковариации и IEnumerable<object>.Это означает, что любой массив является IEnumerable<object>.

int[] array = new int[] { 0, 1, 2 };
object obj=array;
IEnumerable<object> collection = (IEnumerable<object>)obj;

foreach (object item in collection)
{
    Console.WriteLine(item.ToString());
}
2 голосов
/ 18 августа 2011

Вы можете разыграть его.

var myTempArray = obj as IEnumerable;

foreach (object item in myTempArray)
   ...
0 голосов
/ 18 августа 2011

В .net 4.0 вы можете использовать ненужное ключевое слово dynamic,

dynamic object obj = array;
Console.Write(obj[0].ToString());
0 голосов
/ 18 августа 2011

Как только вы назначите array в качестве значения из obj, вы произвели бросок.Вам нужно будет извлечь предмет, выполнив приведение еще раз:

int[] array = new int[] { 0, 1, 2 };
object obj = array;

var i = ((int[])obj)[0];

Если вы не знаете тип массива, вам придется использовать обобщенные значения:

object obj;

void StoreArray<T>(T array)
{
    obj = array;
}

T GetValue<T>(int index)
{
    return (T)(obj as T[])[index];
}

Примечание:непроверенный образец.

0 голосов
/ 18 августа 2011

РЕДАКТИРОВАТЬ (снова)

Если вы знаете, что объект является массивом, и вы не знаете тип массива, вы можете просто привести его как object[]. Это будет демонстративно работать, если все, что вам нужно сделать, это позвонить toString().

Например

(obj as object[])
0 голосов
/ 18 августа 2011

Вам нужно привести его обратно к int [], а затем извлечь элементы. В конце концов, тот факт, что вы знаете, что это массив целых чисел, не отражает тот факт, что вы заявляете, что это объект.

Посмотрите на это с точки зрения компилятора. Все, что он знает, - это то, что вы определили переменную объекта, которая в этот момент является целочисленным массивом, но позже она может измениться на другую вещь ... ведь это всего лишь объект.

Проверки ограничений выполняются средой выполнения при выполнении приведения, поэтому логически компилятор не позволит вам просто использовать его в качестве массива, а потребует, чтобы вы сначала CAST его в массив.

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