2013-05-10 3 views
2

У меня есть object, который имеет тип Array (то есть object.GetType().IsArray возвращает true). Мой вопрос в том, как я могу узнать, является ли это зубчатым или многомерным массивом? Есть ли способ сериализации массива, чтобы код «не знал» разницу (используя отражение)?Сериализация зубчатых и многомерных массивов

Обратите внимание, что массив имеет произвольную длину/размерность. Я думал, что могу, возможно, разобрать Type.Name, чтобы найти [, (как в одной части [,,]) или [][], чтобы различать их, но это все равно означает, что у меня будет два пути кода для каждого случая, и я чувствую, что быть лучшим способом добиться этого, чем имена типов синтаксического анализа.

Для массива с зазубринами достаточно легко взять массив, а затем продолжать индексировать его с помощью [], чтобы перебрать все элементы, однако этот подход не работает для многомерных массивов.

+0

Вы пишете собственный механизм сериализации? почему бы не использовать один из нескольких вариантов, встроенных в инфраструктуру .net? –

+0

Это в основном учебное упражнение :) – nickolayratchev

+0

Попробуйте изучить параметры настройки DataContractSerializer – Saravanan

ответ

2

Ящурный массив - это массив массивов. Так что все, что вам нужно сделать, это посмотреть на тип элемента и проверить, что это массив, а также:

static bool IsJaggedArray(object obj) { 
     var t = obj.GetType(); 
     return t.IsArray && t.GetElementType().IsArray; 
    } 

    static void Test() { 
     var a1 = new int[42]; 
     Debug.Assert(!IsJaggedArray(a1)); 
     var a2 = new int[4, 2]; 
     Debug.Assert(!IsJaggedArray(a2)); 
     var a3 = new int[42][]; 
     Debug.Assert(IsJaggedArray(a3)); 
    } 

Cast на массив и использовать свойство Rank, чтобы найти число измерений для многомерного массива.

+0

Я понял, что я также могу использовать 'Array.Rank', чтобы определить, является ли массив многомерным (для которого« Ранг> 1 »является истинным). Это отлично работает, спасибо! – nickolayratchev

Смежные вопросы