C# ProductName隐藏System.Windows.Forms.Control.ProductName

C# ProductName隐藏System.Windows.Forms.Control.ProductName,c#,winforms,inheritance,warnings,C#,Winforms,Inheritance,Warnings,我的表单中有一个属性ProductName。我在编译代码时收到警告 FormInventory.ProductName隐藏继承的成员“System.Windows.Forms.Control.ProductName”。如果要隐藏,请使用新关键字 下面是我的代码 public partial class FormInventory : Form, IInventoryView { public FormInventory() { } public string Prod

我的表单中有一个属性ProductName。我在编译代码时收到警告

FormInventory.ProductName
隐藏继承的成员“
System.Windows.Forms.Control.ProductName”
。如果要隐藏,请使用新关键字

下面是我的代码

public partial class FormInventory : Form, IInventoryView
{
   public FormInventory()
   {
   } 

   public string ProductName
   {
      get { return this.textProductName.text; }
      set { this.textProductName.text = value; }
   }
}
textProductName
是一个文本框

我知道
ProductName
隐藏基类的属性
Forms.Control.ProductName
。我的问题是

  • 是否可以在不重命名my
    FormInventory.ProductName
    属性的情况下抑制警告

  • 我目前正处于开发的开始阶段,如果我使用
    new
    修改器隐藏此属性,在发布产品时会出现任何问题,因为基本属性
    Forms.Control.ProductName
    返回包含控件的程序集的产品名。其中,作为my
    FormInventory.ProductName
    返回用户输入的值

  • 我们将在何处使用此
    Forms.Control.ProductName
    ,因为我以前从未使用过它

  • 我搜索并发现了类似的问题


    这些问题并没有解决我的问题,但帮助我理解了警告的原因。

    1。是的,只需使用
    new
    关键字,如
    public new string ProductName{get;set;}

    2。否,它只是返回

    3.用于调试和一些“反射”。我说“反射”是因为它更像是人造的反射

    所以,这样做是安全的。但是你为什么不干脆把它改成MyCompanyProductName呢


    关于1。是的,只需使用
    new
    关键字,如
    public new string ProductName{get;set;}

    2。否,它只是返回

    3.用于调试和一些“反射”。我说“反射”是因为它更像是人造的反射

    所以,这样做是安全的。但是你为什么不干脆把它改成MyCompanyProductName呢


    关于

    使用“新建”关键字将抑制警告。执行此操作时,调用ProductName属性的结果取决于用于引用表单的变量的类型。。。例如,如果从另一个类调用属性:

    // Notice that we're only creating one object and
    // assigning it to two different variables.
    FormInventory explicitlyNameForm = new FormInventory();
    Form referenceToBaseForm = explicitlyNameForm;
    
    // Acting on the child reference (FormInventory) will
    // operate on YOUR implementation of ProductName
    explicitlyNameForm.ProductName = "Some Value";
    
    // But acting on the parent reference (Form) will
    // operate on the .NET implementation of ProductName
    referenceToBaseForm.ProductName = "Some Other Value";
    
    最终的结果可能是你想要的。。。编译器根据您声明变量的方式知道使用哪个实现。由于.NET framework中的所有引用都引用Form类,而不是您的新类,因此没有影响.NET framework中与此属性相关的任何内容的风险


    但是,正如其他人所建议的,如果您能够重命名该属性,可能会减少混淆。

    使用“new”关键字将抑制警告。执行此操作时,调用ProductName属性的结果取决于用于引用表单的变量的类型。。。例如,如果从另一个类调用属性:

    // Notice that we're only creating one object and
    // assigning it to two different variables.
    FormInventory explicitlyNameForm = new FormInventory();
    Form referenceToBaseForm = explicitlyNameForm;
    
    // Acting on the child reference (FormInventory) will
    // operate on YOUR implementation of ProductName
    explicitlyNameForm.ProductName = "Some Value";
    
    // But acting on the parent reference (Form) will
    // operate on the .NET implementation of ProductName
    referenceToBaseForm.ProductName = "Some Other Value";
    
    最终的结果可能是你想要的。。。编译器根据您声明变量的方式知道使用哪个实现。由于.NET framework中的所有引用都引用Form类,而不是您的新类,因此没有影响.NET framework中与此属性相关的任何内容的风险


    但是,正如其他人所建议的,如果能够重命名属性,可能会减少混淆。

    如果ProductName是一个要显示在表单上的表单字段,为什么不将属性的所有字段抽象为一个单独的产品实体呢。这将简化应用程序的维护(并使其更符合MVC/MVVM等模式)

    编辑:

    在我看来,Rod Cerata的博客提供的架构看起来还不错,但我相信通过为您的员工封装“ViewModel”会有所改进

    看看EmployeePresenter.cs,你会看到很多重复的代码,比如:

            _model.EmployeeID = _view.EmployeeID;
            _model.Lastname = _view.Lastname;
            _model.Firstname = _view.Firstname;
            _model.EmployeeType = _view.EmployeeType;
            _model.Salary = _view.Salary;
            _model.TAX = _view.TAX;
    

    IMO将通过创建一个新的EmployeeViewModel类(或多或少与EmployeeModel相同,加上任何特定于“屏幕”的字段,例如标题,“模式”(编辑、新建、只读等)来改进,然后使用AutoMapper之类的工具,这样可以减少上面的代码。

    如果ProductName是一个要显示在表单上的表单字段,为什么不将所有属性字段抽象到一个单独的产品实体中呢。这样可以简化应用程序的维护(并使其更符合MVC/MVVM等模式),例如

    编辑:

    在我看来,Rod Cerata的博客提供的架构看起来还不错,但我相信通过为您的员工封装“ViewModel”会有所改进

    看看EmployeePresenter.cs,你会看到很多重复的代码,比如:

            _model.EmployeeID = _view.EmployeeID;
            _model.Lastname = _view.Lastname;
            _model.Firstname = _view.Firstname;
            _model.EmployeeType = _view.EmployeeType;
            _model.Salary = _view.Salary;
            _model.TAX = _view.TAX;
    

    IMO将通过创建一个新的EmployeeViewModel类(或多或少与EmployeeModel相同,加上任何特定于“屏幕”的字段,例如标题,“模式”(编辑、新建、只读等)来改进,然后使用AutoMapper之类的工具,这将减少上面的代码。

    我已经更新了问题中的代码。ProductName属性获取并设置textbox textProduct的值。我的演示者将调用ProductName属性获取并设置文本框的值。我目前正在遵循本文中介绍的MVP样式。它简单而实用对我来说很容易理解。谢谢nonnb。ViewModel会很有帮助,就像你说的,如果我将所有的视图字段抽象到一个单独的视图模型中,我认为从视图控件(尤其是“文本框”)检索和绑定数据会有问题。在搜索之后,我遇到了这个问题。我从来没有想过