1

我的表单中有一个属性 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 回答 3

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 的博客提出的架构看起来不错,但我相信它会通过为您的 Employee 封装“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,它会减少上面的代码。

于 2012-07-31T05:03:21.040 回答
1

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

2.不,它只是返回程序集的名称

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

所以,这样往前走是安全的。但是你为什么不简单地把它改成MyCompanyProductName?

问候

于 2012-07-31T04:58:37.010 回答
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 框架内发生的与此属性相关的任何事情。

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

于 2012-07-31T05:00:30.280 回答