我在我的应用程序中使用Devexpress Gridcontrol,它正在以相当快的速度发展,这通常涉及重构,更改属性名称等,因为需求变得更加清晰/发展。
由于属性名称被硬编码到form.designer.cs
文件中的字符串中,因此很难进行重构。我使用 Resharper,我知道您可以选择该框以在字符串文本中搜索,但是当文本Description
或Manufacturer
时,这在我的项目中的不相关字符串文本中出现数百次,因此实现这种方式将非常耗时,坦率地说是浪费时间。
使用nameof
运算符可在显式指定字段名称与为重构提供开箱即用支持之间架起桥梁。
从我的设计器文件中获取此代码片段。
//
// colManufacturer
//
this.colManufacturer.Caption = "Manufacturer";
this.colManufacturer.ColumnEdit = this.xrefManufacturerSearch;
this.colManufacturer.FieldName = "Manufacturer";
this.colManufacturer.Name = "colManufacturer";
this.colManufacturer.Visible = true;
this.colManufacturer.VisibleIndex = 1;
如果我将FieldName
属性替换为
this.colManufacturer.FieldName = nameof(CrossRef.Manufacturer);
但是现在我无法打开此表单的设计器,错误代码"设计器无法处理未知名称nameof
第 125 行。方法初始化组件中的代码由设计器生成,不应手动修改。
有没有办法将 nameof 表达式用于 Devexpress 字段名称?
你不应该在*.designer.cs
文件中进行任何重构,因为
方法中的代码 InitializeComponent 由设计器生成,不应手动修改
此限制的主要原因是 Code-Dom 序列化基础结构基于С#/VB 语法的受限子集。因此,它不支持某些特定的语言功能,例如nameof
.查看 CSharpCodeProvider 以了解允许哪些表达式,或联系 Visual Studio 团队以获取更多信息。
关于 DevExpres GridControl 列自定义,我建议您考虑这样一个事实,即 GridControl 支持广泛的注释属性,它允许您指定列的显示、格式化和验证方式,而无需设计时自定义。应仅在 DTO 级别应用特定批注,然后将这些对象集合直接分配给 GridControl 的数据源属性:
public class CrossRef{
[Display(Name = "MANUFACTURER")]
[...]
public string Manufacturer { get; set; }
}
// ...
gridControl1.DataSource = new BindingList<CrossRef> {
new CrossRef() { Manufacturer = ... },
...
};