You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:51:33