2017-01-13 5 views
1

ボットのUserDataにオブジェクトを格納しようとしています。私はタイプPersonalDataの変数を必要とする私のルイス・クラスではボットの複雑なオブジェクトにUserDataを格納する方法

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

:すべての

まず私は、以下のクラスを持っています。

これは、デバッガが私の意図に決して入り込まないという問題を引き起こしています。それのどこが悪いんだい?私はこのような意図でPersonalDataのオブジェクトを作成する場合

今、:

PersonalData personalData = new PersonalData(); 

それが正常に作成されます。 しかし、私はプログラムがuserNameからpersonalData.Name私はNullReferenceExceptionと私のPersonalDataオブジェクトがnullを取得設定しようとするとすぐに私のオブジェクト

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

に値を代入したいときに。 userNameが空ではないことを二重にチェックしました。

私には何が欠けていますか?

ありがとうございます!

答えて

4

UserDataを使用している場合は、なぜダイアログに変数を設定する必要がありますか?

変数を使用する場合は、PersonalDataをシリアル化できる必要があります。したがって、[Serializable]属性をクラスに追加する必要があります。

ダイアログに変数を保存する代わりに、UserDataバッグに保存するPersonalDataオブジェクトに常にアクセスする必要があります。

オブジェクト全体を保存するのではなく、値を設定するときに名前を保存するだけなので、UserDataバッグから個人データを取得するときは、オブジェクトではなく名前を取得します。そのため、が存在しないため、NullReferenceExceptionが表示されます。

私はコードがされるべきだと思う:

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

状態についての詳細を学ぶために、あなたもthisサンプルを見ることができます。

+0

私は、次のようなIF文の後にPersonalDataオブジェクトを初期化しなければなりませんでした:personalData = new PersonalData();あなたのソリューションでうまくいきました。 – Soeren

+0

"TryGetValue"関数が失敗した場合、out値はnullに設定されていることがわかりました。そのため、最初にオブジェクト変数を初期化してから、任意の値を設定する必要があります。 – Soeren

関連する問題