C# ProductName隐藏System.Windows.Forms.Control.ProductName
我的表单中有一个属性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
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
。我的问题是
FormInventory.ProductName
属性的情况下抑制警告new
修改器隐藏此属性,在发布产品时会出现任何问题,因为基本属性Forms.Control.ProductName
返回包含控件的程序集的产品名。其中,作为myFormInventory.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会很有帮助,就像你说的,如果我将所有的视图字段抽象到一个单独的视图模型中,我认为从视图控件(尤其是“文本框”)检索和绑定数据会有问题。在搜索之后,我遇到了这个问题。我从来没有想过