C#如何让自定义类字段按定义顺序在列表中展示而非字母排序
问题原因
字段自动按字母排序和你用dynamic填充对象的逻辑无关,是因为.NET 默认获取类属性的 API(比如Type.GetProperties())不保证返回类定义的原始顺序,大部分序列化框架、UI 绑定控件、调试工具默认会将返回的属性按字母序排列展示。
你现有填充对象的ExtractField方法不需要修改,展示顺序和对象填充逻辑无关,只需调整展示/序列化环节的配置即可。
解决方法
场景1:序列化输出(JSON/XML等)
给Presenter类的属性加顺序标记即可,主流序列化框架都支持:
- 如果你用System.Text.Json(.NET Core 3.0+ 内置):
using System.Text.Json.Serialization; public class Presenter { [JsonPropertyOrder(1)] public int? Society { get; set; } [JsonPropertyOrder(2)] public int? SenderCode { get; set; } [JsonPropertyOrder(3)] public string BusinessNameSender { get; set; } [JsonPropertyOrder(4)] public string AddressSender { get; set; } [JsonPropertyOrder(5)] public string VatNumberSender { get; set; } [JsonPropertyOrder(6)] public string Check { get; set; } }
- 如果你用Newtonsoft.Json(Json.NET):
把上面的[JsonPropertyOrder(N)]替换为[JsonProperty(Order = N)]即可。
场景2:UI控件绑定(DataGridView、DataGrid等)
关闭控件的自动生成列功能,手动按你需要的顺序添加绑定列,以WinForms的DataGridView为例:
dataGridView1.AutoGenerateColumns = false; // 按你要的顺序依次添加列 dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() { DataPropertyName = nameof(Presenter.Society), HeaderText = "Society" }); dataGridView1.Columns.Add(new DataGridViewTextBoxColumn() { DataPropertyName = nameof(Presenter.SenderCode), HeaderText = "SenderCode" }); // 剩余属性按需求顺序添加完成后再绑定数据源 dataGridView1.DataSource = yourPresenterList;
场景3:调试时查看顺序
可以给类加DebuggerDisplay特性直接按你要的顺序定义展示内容,示例:
[DebuggerDisplay("Society={Society}, SenderCode={SenderCode}, BusinessNameSender={BusinessNameSender}, AddressSender={AddressSender}, VatNumberSender={VatNumberSender}, Check={Check}")] public class Presenter { // 原有属性定义不变 }
内容的提问来源于stack exchange,提问作者Riccardo Pezzolati
相关产品推荐
相关产品推荐

