2012-04-16 2 views
3

У меня есть открытый класс под названием Profile. Очень простой класс модели в настоящее время с 2 свойствами; string Name и string Fields. По мере развития проекта класс будет расширяться, но на данный момент это не особенно важно.Возможно ли это с IList

У меня есть Global static IList типа Profile под названием Profiles. Я новичок в манипулировании данными в этих типах IEnumerable, но я хочу обновить одно из свойств одного профиля. Я пробовал следующее, но я получаю ссылку на объект, не заданную исключение. Ниже, где я установить свойство:

Profiles.Single(x => x.Name == listBoxProfiles.Text).Fields = textBoxFieldName.Text; 

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

Если бы кто-нибудь мог пролить свет, я был бы благодарен.

+0

На самом деле хороший вопрос, +1. – SkonJeet

+0

@RoyDictus - «Я получаю ссылку на объект, не заданное исключение» – SkonJeet

+0

Если добавить точку останова в строке и запустить только «Profiles.Single (x => x.Name == listBoxProfiles.Text)» в непосредственном окне при отладке , вы получаете профиль? Похоже, что нет профиля с именем, которое соответствует вашему значению. –

ответ

1

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

var profile = Profiles.SingleOrDefault(x => x.Name == listBoxProfiles.Text); 

if (profile != null) 
{ 
    profile.Fields = textBoxFieldName.Text; 
} 
else 
{ 
    Profiles.Add(new Profile(textBoxFieldName.Text)); 
} 

Этот код будет справляться с отсутствующими значениями, SingleOrDefault ожидает 0 или 1 пункты, которые будут возвращены. Он выдает исключение, если найдено более 1 элемента.

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

+0

Спасибо за этот ответ Адам. В ответ на ваш последний бит, если я могу получить выражение для обновления списка, тогда да, я знаю, что он всегда будет работать. Ранее в методе я проверяю, что выбран правильный профиль, а также что-то есть в текстовом поле. Ваш код сработал, и я отметил его соответствующим образом - большое вам спасибо за это! Просто из интереса я понятия не имею, как профиль переменной обновляет этот список? Я думал, что это просто отдельная переменная. Создает ли тип результата экземпляр списка, который затем обновляет его? – Compunutter

+0

@Govix Если я правильно вас понимаю: переменная 'profile' (как возвращено из списка) является просто ссылкой на базовый объект. Вы обновляете «Поля» этого базового объекта, и как список, так и локальная переменная «видят» обновление, потому что их ссылки указывают на один и тот же базовый объект. –

+0

Большое вам спасибо! Это именно то, что я хотел знать. Все переменные возвращаются из ссылок на методы или только результаты IEnumerable? – Compunutter

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