我的表单中有一个属性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
。我的问题是
是否可以在不重命名FormInventory.ProductName
属性的情况下取消警告
我目前处于开发阶段,如果我使用new
修饰符隐藏此属性,则在发布产品时会出现任何问题,因为基本属性Forms.Control.ProductName
返回包含该控件的程序集的产品名称。我的FormInventory.ProductName
返回用户输入值的位置。
我们将在哪里使用此Forms.Control.ProductName
,因为我之前从未使用过它。
我搜索并找到了类似的问题
这些问题并没有解决我的问题,但帮助我理解了警告的原因。
答案 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框架中与此属性相关的任何内容的风险。
但是,正如其他人所建议的那样,如果您能够重命名该属性,可能会减少混淆。