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

时间:2012-07-31 04:45:45

标签: c# winforms inheritance warnings

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

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

下面是我的代码

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。我的问题是

  1. 是否可以在不重命名FormInventory.ProductName属性的情况下取消警告

  2. 我目前处于开发阶段,如果我使用new修饰符隐藏此属性,则在发布产品时会出现任何问题,因为基本属性Forms.Control.ProductName返回包含该控件的程序集的产品名称。我的FormInventory.ProductName返回用户输入值的位置。

  3. 我们将在哪里使用此Forms.Control.ProductName,因为我之前从未使用过它。

  4. 我搜索并找到了类似的问题

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

3 个答案:

答案 0 :(得分:2)

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

public class Product
{
     public string ProductName{ get; set; }
     public int ProductSize{ get; set; }
     // etc
}

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

   public Product Product
   {
      get;
      set;
   }
}

修改:

IMO,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这样的工具,这会减少上面的代码。

答案 1 :(得分:1)

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

2。不,它只返回name of the assembly

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

所以,以这种方式前进是安全的。但是你为什么不把它改成MyCompanyProductName

此致

答案 2 :(得分:1)

使用'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框架中的所有引用都引用了Form类,而不是新类,因此不存在影响.NET框架中与此属性相关的任何内容的风险。

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