我有一个名为贷方的属性,之前是字符串,后来又更改为复杂类型 Lender 。我认为隐式运算符重载会解决从字符串到对象的转换,但它没有,并且反序列化失败。
我可以以任何方式修复此问题,还是必须重构我的代码以实现向后兼容?
在:
class AnObject {
string Lender { get; set; }
}
后:
class AnObject {
Lender Lender { get; set; }
}
class Lender {
public string Name { get; set; } // Previously the string property on AnObject.
public static implicit operator Lender(string name) {
return new Lender(name);
}
}
例外:
第1行位置错误249.期待状态'元素' ...遇到'文字'名称'',命名空间'。
答案 0 :(得分:2)
您在错误的班级中实施了implicit operator
,它应该在Lender
。
public class AnObject
{
public Lender Lender { get; set; }
}
public class Lender
{
public Lender(string name)
{
Name = name;
}
public string Name { get; set; }
public static implicit operator Lender(string name)
{
return new Lender(name);
}
public static implicit operator string (Lender lender)
{
return lender.Name;
}
}
然后你可以做
var obj = new AnObject();
obj.Lender = new Lender("lender");
并通过隐式转换
var obj = new AnObject();
obj.Lender = "lender";
编辑:臭名昭着的动态吗?即使它有效,也很可怕。
public class Lender
{
public Lender(string name)
{
Name = name;
}
public string Name { get; set; }
}
public class AnObject
{
private Lender _lender;
public dynamic Lender
{
get { return _lender; }
set
{
_lender = value is string ? new Lender(value as string) : value as Lender;
}
}
}
答案 1 :(得分:0)
我必须通过使用DataContract序列化程序序列化的 Lender 对象替换 Lender 节点下的文本节点,将XML“转换”为新格式。