2017-08-31 9 views
0

私は、抽象タイプのためにPromptDialog.PromptChoiceをオーバーライドしました。私は同じロジックを共有したい2人の子供を持っていますが、TryParseロジックの一部に特定の変数を使用できることを保証する必要があります。子供の一人は、私はここに何の問題もありません。しかし、他の子供にとっては、私は本当に奇妙な行動に陥っています。 CustomPromptChoice.Choice(コンテキスト、関数、オプション)のダイアログから呼び出すと、私は期待しているオプションを見ています。ユーザーには正しいオプションリストが表示されますが、オプションを選択するとTryParseロジックですべてのオプションが変更されていることがわかります。明らかに、私のTryParseは常に失敗します。誰もこの行動を見たことがありますか?ここでユーザー入力を受け取った後のプロンプトチョイス変更オプション

は、基本クラスである:ここで

[Serializable] 
public abstract class ExtractionClass 
{ 
    public List<ExtractionClass> children; 
    public ExtractionClass parent; 
    public string name; 
    public string value; 
    public override string ToString() 
    { 
     return name; 
    } 
    public ExtractionClass() { } 
    public ExtractionClass(string name, string value, ExtractionClass parent) 
    { 
     this.name = name; 
     this.value = value; 
     this.parent = parent; 
    } 
    //upon initialization, guarantee that children is filled correctly 
    public abstract void SetChildren(); 
    //use to check if child is a where match 
    public abstract bool IsWhereMatch(ExtractionClass child, string query=""); 
    //use to check if child is a when match 
    public abstract bool IsWhenMatch(ExtractionClass child, string query=""); 
    //use to check if child is a who match 
    public abstract bool IsWhoMatch(ExtractionClass child, string query=""); 
    //use to check if child is a what match 
    public abstract bool IsWhatMatch(ExtractionClass child, string query=""); 
} 

が動作しない子クラスのストリップダウンバージョンです:

[Serializable] 
public class ChildClass1:ExtractionClass 
{ 
    public Dictionary<ChildClass1, int> childrenLookup; 
    public Dictionary<string, ChildClass1> childrenNames; 
    private dynamic content; 
    public string spokenName; 
    static HashSet<string> childrenToKeep = new HashSet<string>() 
    static List<string> ignoreNames = new List<string>(); 
    public static Dictionary<string, List<string>> nodeNameSynonyms = new Dictionary<string, List<string>>(); 
    public static HashSet<string> WhoNodes = new HashSet<string>(); 
    public ChildClass1(dynamic content) 
    { 
     this.children = new List<ExtractionClass>(); 
     this.childrenLookup = new Dictionary<ChildClass1, int>(); 
     this.childrenNames = new Dictionary<string, ChildClass1>(); 
     this.parent = null; 
     this.name = String.Empty; 
     this.value = String.Empty; 
     this.spokenName = String.Empty; 
     this.content = content; 
    } 
    public ChildClass1(string name, string value, List<string> synonyms) : this(null) 
    { 
     this.name = name; 
     this.spokenName = name; 
     double doubleValue; 
     int integerValue; 
     bool isInt = Int32.TryParse(value, out integerValue); 
     if (isInt) 
     { 
      this.value = string.Format("{0}", integerValue); 
     } 
     else { 
      bool isDouble = Double.TryParse(value, out doubleValue); 
      if (isDouble) 
      { 
       this.value = string.Format("{0:N2}", doubleValue); 
      } 
      else 
      { 
       this.value = value; 
      } 
     } 

    } 
    public override string ToString() 
    { 
     return this.name; 
    } 

    public override void SetChildren() 
    { 
     //pretty long and complicated 
    } 

    public override bool IsWhereMatch(ExtractionClass child, string query = "") 
    { 
     return false; 
    } 

    public override bool IsWhenMatch(ExtractionClass child, string query = "") 
    { 
     return false; 
    } 

    public override bool IsWhoMatch(ExtractionClass child, string query = "") 
    { 
     return false; 
    } 

    public override bool IsWhatMatch(ExtractionClass child, string query = "") 
    { 
     return false; 
    } 
} 

そして最後に、ここでのストリップダウンバージョンです仕事をするクラス:

public class ChildClass2: ExtractionClass 
{ 
    public Address address; 
    public Rating rating; 
    public string description, telephone, spokenName; 


    public ChildClass2(string name, string value, ExtractionClass parent) : base(name, value, parent) { children = new List<ExtractionClass>(); } 
    public override string ToString() 
    { 
     return name; 
    } 


    public override void SetChildren() 
    { 
     //a bit of a mess but works as expected 
    } 


} 

私には意味がありませんが、私はこのダイヤルg:

ExtractionPromptChoice.Choice(context, this.CarouselEntityHandler, nodeOptions); 

スタックをステップ実行すると、正しいオプションがユーザーに返されます。私のコントロールの最後のインスタンスのnodeOptionsは正しく設定されていますが、ExtractionPromptChoice TryParseロジックに行くと、オプションが異なります。 nodeOptionsはChildClass1型のリストを保持することになりますが、プロンプトはExtractionClassに対して定義されています。

編集:私のコードについては、リモートサーバーがMessagesControllerコードに400 Bad Requestエラーを返すことがあります。

+1

2人の子供は同じではありません。行動上の問題が発生したときは、他の兄弟を混乱させるかもしれない、そうでなければ他の兄弟を怒らせるかもしれないすべての事実を持つことが最善です。私たちはあなたを助けることができるいくつかのコードを貼り付けることができますか? –

+0

haha​​良い点。私はどこのコードを貼り付けたのか分からないので、コードを貼り付けませんでした。子供のコードを追加します – jon

答えて

0

私のコードでは、エラーを伝播せずにエラーをキャッチすることができます。私はChildClass1の中で私は直列化を壊す動的なものがあるので、400のBad Requestレスポンスを得ていました。このエラーはどこにもスローされず、間違ったPromptOptionの選択肢が表示されていた理由を正確にはわかりませんが、エラーが発生したときにその動作が正しく定義されているとは思われません。

関連する問題