我有一些dto对象,我想用wcf通过线路发送.在这个简单的例子中,它有FirstName,LastName和Name.Name返回first中的firstname和lastname.
通常情况下,我不会使用清除器为Name属性,但我必须,否则它无法序列化,所以我尝试内部但我在名字设置器上收到错误
LibSys.WebServices.dll中发生了未处理的"System.StackOverflowException"类型异常
[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; }
}
Run Code Online (Sandbox Code Playgroud)
你的setter递归调用自己.如果值Name是从其他属性计算的,则应该完全省略setter.由于它完全是从其他属性计算出来的,因此您可能不需要对其进行序列化.
如果有一个绝对必须的setter,你可以像这样创建一个空的setter:
public string Name {
get { return string.Format("{0} {1}", FirstName, LastName); }
internal set { }
}
Run Code Online (Sandbox Code Playgroud)
这个bug是setter的Name.它无条件地调用setter,Name因此会导致堆栈溢出.
如果Name是组合FirstName并LastName,那么你应该拆分value的调节器和两个值赋给FirstName和LastName分别
public string Name {
get { return string.Format("{0} {1}", FirstName, LastName); }
internal set
{
var values = value.Split(new char[] { ' ' });
FirstName = values[0];
LastName = values[1];
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个非常粗略的例子,在签入之前我会添加一些错误检查以确保字符串实际上有一个空格.
真的,虽然我质疑为什么这个属性需要一个二传手.这真的是一个计算属性.因此,它应该负责仅显示值.应直接在计算值的属性上设置值.