2009-11-04 5 views
1

У меня есть свойство string, которое определяет имя файла для XML-файла. Когда пользователь вводит это имя файла в свойство, у меня есть сеттер, вызывающий функцию parseXml() сразу после установки «fileName = value», чтобы заполнить dataTable данными из XML-файла, чтобы он отображался в дизайнере. По какой-то причине, когда у меня есть вызов этой функции в настройщике свойств, сеттер заканчивается тем, что вызывается каждый раз каждый раз каждый раз, когда я меняю свойство, а второй раз является пустой строкой, которая вызывает ошибку. Почему он это делает?C#: вызов метода вызова внутри средства определения свойств строки

public String FileName 
{ 
    get { return fileName; } 
    set 
    { 
     fileName = value; 
     parseXmlFile(); 
    } 
} 
+0

Давайте посмотрим ваш код –

+0

Можете ли вы опубликовать код - как свойство, так и где он используется. – ChrisF

+5

____POST CODE____ –

ответ

4

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

+0

Спасибо, что отвечает на мой вопрос. Я просто хотел убедиться, что это проблема в моем коде, а не конфликт в .NET, прежде чем я потратил слишком много времени на отладку, когда мне нужно рефакторинг. – alexD

9

Мое первоначальное предположение заключалось в том, что что-то в parseXml() снова вызывает этот сеттер. Что произойдет, если вы удалите вызов parseXml()? Вы пробовали отлаживать и переходить через код, поскольку он работает, чтобы увидеть, что именно вызывает второй сеттер?

Если вы ударили точку останова на filename = value; и ударили ее, что показывает окно вызова?

+1

При первом вызове свойства имя_файла и значения «значение» являются правильными вводами от пользователя. Функция parseXml выполняется без проблем. Сразу после этого он снова проходит через сеттер, и теперь «значение» - это пустая строка, поэтому он сбрасывает имя файла в пустую строку и выполняет parseXml() с пустым именем файла, а затем вызывает ошибку. – alexD

+2

И как выглядит callstack на второй записи? Откуда звонил сеттер? –

+1

И что показывает окно вызова ** ** во второй раз? –

0

В целом, помимо проблемы, с которой вы сталкиваетесь, размещение дорогостоящих операций ввода-вывода за установщиками свойств немного затруднено.

Если вы хотите открыть файл и разбор материалов и т. Д., То лучше иметь отдельный метод, названный соответствующим образом, который выполняет IO и устанавливает это свойство (имя файла) в конце, когда метод успешно завершил свою работу.

+5

Не совсем ответ на его проблему - я сказал то же самое, что и комментарий к его вопросу. –