2017-01-13 3 views
1

Я пытаюсь сохранить объект в UserData бота.Как сохранить UserData в сложном объекте в Bot

Прежде всего я имею следующий класс:

public class PersonalData 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

В моем Луисе классе мне нужен переменная PersonalData типа.

public class Luis : LuisDialog<object> 
{ 
    PersonalData personalData; 

Это уже приводит к тому, что отладчик никогда не входит ни в какие мои намерения. Что в этом плохого?

Теперь, если я создаю объект PersonalData в намерениях, как это:

PersonalData personalData = new PersonalData(); 

будет успешно создан. Но когда я хочу, чтобы присвоить значение моего объекта

if (!context.UserData.TryGetValue(ContextConstants.personalData, out personalData)) 
{ 
     personalData.Name = userName; 
     context.UserData.SetValue(ContextConstants.personalData, personalData.Name); 
} 

Как только программа пытается установить personalData.Name к userName я получаю NullReferenceException и мой PersonalData объект является нулевым. Я дважды проверял, что имя пользователя не пусто.

Что мне не хватает?

Заранее благодарен!

ответ

4

Если вы используете UserData, почему вам нужно иметь переменную в вашем диалоговом окне?

Если вы хотите иметь переменную, ваш PersonalData должен быть сериализуемым, поэтому вам нужно будет добавить атрибут [Serializable] к классу.

Но вместо сохранения переменной в диалоговом окне вы всегда должны обращаться к объекту PersonalData, который вы будете сохранять в сумке UserData.

Теперь, когда вы устанавливаете значение вместо сохранения всего объекта, вы просто сохраняете имя, поэтому, когда вы извлекаете личные данные из мешка UserData, вы получаете имя, а не объект, поэтому вы получаете NullReferenceException, потому что personalData.Name не существует.

Я думаю, что код должен быть:

if (!context.UserData.TryGetValue(ContextConstants.personalData, out personalData)) 
{ 
     personalData.Name = userName; 
     context.UserData.SetValue(ContextConstants.personalData, personalData); 
} 

Чтобы узнать больше о состоянии, вы также можете увидеть this образец.

+0

Мне пришлось инициализировать объект PersonalData после оператора IF следующим образом: personalData = new PersonalData(); и тогда это сработало отлично с вашим решением. – Soeren

+0

Я понял, что если функция «TryGetValue» терпит неудачу, значение out равно null. Вот почему сначала нужно инициализировать переменную объекта, а затем установить любые значения. – Soeren

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