C# 从基类继承的字典不能添加到派生类
我有一个POs的抽象类C# 从基类继承的字典不能添加到派生类,c#,.net,C#,.net,我有一个POs的抽象类 public abstract class PO { public abstract Dictionary<string, object> InvalidFields { get; } public abstract string PONumber { get; set; } } 公共抽象类PO { 公共摘要字典InvalidFields{get;} 公共抽象字符串PONumber{get;set;} } 由两种不同类型的PO继承:CPO和POR
public abstract class PO
{
public abstract Dictionary<string, object> InvalidFields { get; }
public abstract string PONumber { get; set; }
}
公共抽象类PO
{
公共摘要字典InvalidFields{get;}
公共抽象字符串PONumber{get;set;}
}
由两种不同类型的PO继承:CPO和POR
public class CPO
{
private string poNumber;
public override Dictionary<string, object> InvalidFields => new Dictionary<string, object>();
public override string PONumber
{
get
{
return poNumber;
}
set
{
if (!ValidatePONumber(value)) InvalidFields.Add("CPO Number", value);
poNumber = value;
}
}
}
公共类CPO
{
私有字符串poNumber;
public override Dictionary InvalidFields=>new Dictionary();
公共重写字符串PONumber
{
得到
{
返回poNumber;
}
设置
{
如果(!ValidatePONumber(value))无效字段。添加(“CPO编号”,value);
poNumber=值;
}
}
}
当validateNumber(value)
返回false
时,它会正确执行InvalidFields.Add()
,但字典从未实际添加到。在Locals窗口中,创建了一个名为Namespace.PO.InvalidFields.get returned的新变量
,我可以看到添加的新键。但是,this.InvalidFields
没有值
因此,看起来抽象基类
PO
中的dict正在创建并添加到中,而不是派生类CPO
上面给出的代码甚至没有编译。您派生的类实际上并不是从抽象类继承的(我假设它是一个输入错误)。即使在添加抽象类之后,字典实例化也会抛出错误,因为它是一个属性定义,并且缺少“set”定义(InvalidFields缺少“set”访问器定义)
而且,这听起来像是一个复制品
我尝试过这个,但做了一些小的修改,请参见下面的代码。正如@yransis在评论中所说的,InvalidFields被视为“get”属性,每次执行“Add”步骤时都返回dictionary的新实例
class DerivedCpo : AbstractPo
{
private string poNumber;
private Dictionary<string, object> invalidFieldsBackingField;
public override Dictionary<string, object> InvalidFields
{
get
{
return invalidFieldsBackingField;
}
set { this.invalidFieldsBackingField = value; }
}
public DerivedCpo()
{
this.InvalidFields = new Dictionary<string, object>();
}
public override string PoNumber
{
get { return poNumber;}
set
{
if(!ValidatePONumber((value)))
InvalidFields.Add("CPO Number", value);
poNumber = value;
}
}
private bool ValidatePONumber(string value)
{
if (string.IsNullOrEmpty(value))
{
return false;
}
if (value.Length > 5)
return false;
return true;
}
}
在上面的代码中,我添加了显式支持字段。它在构造函数中只实例化了一次。这样,InvalidFields的内容是持久的。在您的代码中,您返回了dictionary的一个新实例,实际上丢失了存储在两个“get”调用之间的数据。感谢Klaus指出了这个问题。我通过设置一个私有的
invalidFields
字段并使用invalidFields.get
返回该字段来解决问题,因为我所做的是使用每个get
返回一个新的Dictionary类
public class CPO : PO
{
private string poNumber;
private Dictionary<string, object> invalidFields = new Dictionary<string, object>();
public override Dictionary<string, object> InvalidFields { get => invalidFields; }
public override PONumber
{
get
{
return poNumber;
}
set
{
if (!ValidatePONumber(value)) InvalidFields.Add("CPO Number", value);
poNumber = value;
}
}
}
公共类CPO:PO
{
私有字符串poNumber;
私有字典invalidFields=新字典();
公共重写字典InvalidFields{get=>InvalidFields;}
公共覆盖编号
{
得到
{
返回poNumber;
}
设置
{
如果(!ValidatePONumber(value))无效字段。添加(“CPO编号”,value);
poNumber=值;
}
}
}
您在每次访问无效字段时都会创建一个新的字典
Ok-因此=>
符号实际上只是充当一个get
?是的,prop=>值;
与prop{get{return value;}相同
public class CPO : PO
{
private string poNumber;
private Dictionary<string, object> invalidFields = new Dictionary<string, object>();
public override Dictionary<string, object> InvalidFields { get => invalidFields; }
public override PONumber
{
get
{
return poNumber;
}
set
{
if (!ValidatePONumber(value)) InvalidFields.Add("CPO Number", value);
poNumber = value;
}
}
}