我有一些dto对象,我希望使用wcf通过线路发送。在这个简单的例子中,它有FirstName,LastName和Name。 Name返回first中的firstname和lastname。
通常情况下,我不会将清除器用于Name属性,但我必须这样做,否则它无法序列化,所以我尝试使用内部但我在Name setter上遇到错误
类型'System.StackOverflowException'的未处理异常 发生在LibSys.WebServices.dll
中
[DataMember]
public string FirstName { get; set; }
[DataMember]
public string LastName { get; set; }
[DataMember]
public string Name {
get { return string.Format("{0} {1}", FirstName, LastName); }
internal set { Name = value; }
}
答案 0 :(得分:6)
你的setter递归调用自己。如果Name
的值是从其他属性计算的,则应该完全省略setter。由于它完全是从其他属性计算出来的,因此您可能不需要将其序列化。
如果有一个绝对必须的setter,你可以像这样创建一个空的setter:
public string Name {
get { return string.Format("{0} {1}", FirstName, LastName); }
internal set { }
}
答案 1 :(得分:5)
该错误是Name
的设置者。它无条件地调用Name
的setter,因此会导致堆栈溢出。
如果Name
是FirstName
和LastName
的组合,那么您应该在设置器中拆分value
并将这两个值分配给FirstName
和{分别为{1}}
LastName
这是一个非常粗略的例子,在签入之前我会添加一些错误检查以确保字符串实际上有空格。
但我真的怀疑为什么这个属性需要一个二传手。它真的是一个计算属性。因此,它应该负责仅显示值。应直接在计算值的属性上设置值。
答案 2 :(得分:0)
问题在于:
public string Name {
get { return string.Format("{0} {1}", FirstName, LastName); }
// you're setting Name to value, that's recursive, you should add another variable.
internal set { Name = value; }
}