C# 从基类继承的字典不能添加到派生类

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

我有一个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 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;
    }
  }
}