Получить длину свойства массива во внутреннем классе в С# или другой метод итерации, который работает?

У меня есть набор классов C#, сгенерированных веб-утилитой json2charp из ответа JSON, полученного в результате вызова REST. Я использую классы для десериализации будущих ответов JSON в эти классы. Все отлично работает. Один из внутренних классов имеет свойство, которое является массивом. Я попытался использовать это свойство в цикле for-loop, используя свойство массива Length, но свойство Length недоступно в текущей области. Я предполагаю, что это потому, что это внутренний класс?

Чтобы обойти эту проблему, я добавил общедоступное свойство с именем CountBreeds, которое просто возвращает длину массива. Это прекрасно работает. Но мне интересно, есть ли способ получить длину свойства массива внутреннего класса без необходимости создавать свойства только для того, чтобы выставить свойство длины массива? Если нет, есть ли способ перебрать массив без добавления поддержки IEnumerable в класс?

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

// The internal class I want to iterate.
internal class Breeds
{

    [JsonProperty("breed")]
    public Breed[] Breed { get; set; }

    [JsonProperty("@animal")]
    public string Animal { get; set; }

    // This property was added to facilitate for loops-that iterate the
    //  entire array, since the Length propery of the array property
    //  can not be accessed.
    public int CountBreeds
    {
        get
        {
            return Breed.Length;
        }
    }
} // internal class Breeds

// Code that iterates the above class.

// >>>> This doesn't work since the Breeds Length property
//  is unavailable in this context.
//
// Add the breeds to the list we return.
for (int i = 0; i < jsonPF.Petfinder.Breeds.Length; i++)
    listRet.Add(jsonPF.Petfinder.Breeds.Breed[i].T);


// >>>> This *does* work because I added manually the CountBreeds
//  property (not auto-generated by json2csharp).
// Add the breeds to the list we return.
for (int i = 0; i < jsonPF.Petfinder.Breeds.CountBreeds; i++)
    listRet.Add(jsonPF.Petfinder.Breeds.Breed[i].T);

person Robert Oschler    schedule 14.04.2013    source источник
comment
Я не вижу причин, по которым Length не должен быть виден. Кроме того, массивы реализуют IEnumerable.   -  person Simon Whitehead    schedule 15.04.2013
comment
Класс, представляющий одну породу с именем Breeds и содержащий массив с именем Breed? Мне одному это кажется странным? Какую логику вы использовали при разработке такого именования?   -  person walther    schedule 15.04.2013


Ответы (2)


Вы запрашивали не длину массива, а несуществующее свойство Length в классе Breeds. Вместо этого попробуйте...

for (int i = 0; i < jsonPF.Petfinder.Breeds.Breed.Length; i++)
person spender    schedule 14.04.2013
comment
Хороший улов! не видел такого - person Kenneth; 15.04.2013
comment
Хороший! Я тоже этого не заметил (просто думал о свойстве Length массива!) - person Simon Whitehead; 15.04.2013
comment
@spender - Спасибо. Вот и все. - person Robert Oschler; 15.04.2013
comment
Остерегайтесь рисков, связанных с подобными именами. Лучше избегать, я считаю. - person spender; 15.04.2013
comment
@spender - Согласен. Однако эти имена взяты из JSON, созданного внешней веб-службой. я их не ставил. - person Robert Oschler; 15.04.2013

Длина должна быть видна. Длина является общедоступным свойством в Array, поэтому она не имеет ничего общего с внутренним классом.

person Kenneth    schedule 14.04.2013