我已经覆盖了一个抽象类型的PromptDialog.PromptChoice。我有两个不同的孩子,我想分享相同的逻辑,但我需要保证某些变量可用于我的部分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
}
}
对我来说没有意义的是,我在对话中打了这个电话:
ExtractionPromptChoice.Choice(context, this.CarouselEntityHandler, nodeOptions);
然后当我逐步完成堆栈时,我看到它返回给用户正确的选项。我的控件的最后一个实例中的nodeOptions设置正确,但是当我转到ExtractionPromptChoice TryParse逻辑时,选项是不同的。 nodeOptions最终保存ChildClass1类型的列表,但是为ExtractionClass定义了promptchoice。
编辑:事实证明我的代码有些东西导致远程服务器在我的MessagesController代码中返回400 Bad Request错误。
答案 0 :(得分:0)
原来我在我的代码中的其他地方有错误的逻辑,它捕获错误而不传播它们。我收到了400 Bad Request响应,因为在ChildClass1中我有一个动态,它打破了序列化。这个错误并没有被抛到任何地方,我不确定为什么我看到了错误的PromptOption选择,但我不认为当我抓住并且不做时,行为是明确定义的重新抛出错误。