如何在C#中将InitiateFormField类的所有属性及值添加到Hashtable
如何将C#模型类属性按指定规则存入Hashtable?
我定义了以下两个C#模型类:
public class InitiateRequest { /// <summary> /// /// </summary> public string FormCode { get; set; } /// <summary> /// /// </summary> public InitiateFormField Fields { get; set; } }
public class InitiateFormField { [Required] [JsonPropertyName("STD_INCIDENTTYPEID")] public string IncidentTypeId { get; set; } [Required] public string STD_SUBJECTTYPEID { get; set; } [Required] public string STD_SUBJECTID { get; set; } public string STD_PARENTSUBJECTID { get; set; } public int PREPARER_ID { get; set; } public string EXISTING_FORMER_CLIENT { get; set; } public string MATTER_TITLE { get; set; } public string MATTER_DESCRIPTION { get; set; } public int SUBMITTING_ATTORNEY { get; set; } public int NEW_MATTER_RESPONSIBLE_ATTORNEY { get; set; } public string MATTER_TYPE { get; set; } public string MATTER_PRACTICE_CODE { get; set; } public string NEW_CLIENT_CODE { get; set; } }
我希望把InitiateFormField类的所有属性添加到Hashtable中:
var properties = new Hashtable();
要求Hashtable的键为模型属性对应的JsonPropertyName(如果存在该特性),否则用属性名;值为属性的实际值。例如:
properties.Add("STD_INCIDENTTYPEID", "myString");
请问有没有实现这个需求的方法?
解决方案
可以通过反射遍历InitiateFormField实例的属性,读取JsonPropertyName特性(如果存在)作为键,属性实际值作为值,最终存入Hashtable。以下是完整实现:
工具方法实现
using System; using System.Collections; using System.Reflection; using System.Text.Json.Serialization; public static class ModelHashtableConverter { public static Hashtable ConvertToHashtable(InitiateFormField model) { var hashtable = new Hashtable(); if (model == null) return hashtable; // 获取模型所有公共实例属性 var properties = typeof(InitiateFormField).GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var prop in properties) { // 获取JsonPropertyName特性 var jsonAttr = prop.GetCustomAttribute<JsonPropertyNameAttribute>(); // 确定键:优先用特性指定的名称,否则用属性名 string key = jsonAttr != null ? jsonAttr.Name : prop.Name; // 获取属性值 object value = prop.GetValue(model); hashtable.Add(key, value); } return hashtable; } }
使用示例
// 初始化模型实例 var formField = new InitiateFormField { IncidentTypeId = "INC-001", STD_SUBJECTTYPEID = "SUBJ-TYPE-001", STD_SUBJECTID = "SUBJ-001", PREPARER_ID = 456, MATTER_TITLE = "Test Matter" }; // 转换为Hashtable var resultHashtable = ModelHashtableConverter.ConvertToHashtable(formField); // 输出验证 foreach (DictionaryEntry entry in resultHashtable) { Console.WriteLine($"Key: {entry.Key}, Value: {entry.Value}"); }
注意事项
- 上述代码依赖
.NET Core 3.0+或.NET 5+的System.Text.Json命名空间。如果使用的是.NET Framework,需要改用Newtonsoft.Json的JsonPropertyAttribute,只需将代码中的JsonPropertyNameAttribute替换为Newtonsoft.Json.JsonPropertyAttribute即可。 - 如果属性值为
null,Hashtable允许存储null值;若需要特殊处理(比如替换为空字符串),可在添加前对value进行判断调整。 - 反射操作存在一定性能开销,如果是高频调用场景,建议缓存
PropertyInfo数组和特性信息,避免重复反射操作。
内容的提问来源于stack exchange,提问作者tRuEsAtM
相关产品推荐
相关产品推荐

