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

如何在C#中可靠获取复杂结构体参数的默认值?

如何通过ParameterInfo可靠获取任意类型参数的默认值?

先看你提供的示例代码:

using System;
using System.Reflection;

public static class Program {
    public static void Main() {
        ParameterInfo parameter = typeof(Program).GetMethod(nameof(TestMethod)).GetParameters()[0];
        if (parameter.ParameterType == typeof(Guid) && parameter.HasDefaultValue) {
            Guid value1 = (Guid)parameter.DefaultValue;
            Guid value2 = (Guid)parameter.RawDefaultValue;
        }
    }

    public static void TestMethod(Guid guid = default(Guid)) { }
}

你遇到的问题是:明明参数有默认值且类型是Guid,但DefaultValue和RawDefaultValue都返回null,而非预期的default(Guid)(即Guid.Empty)。这不是bug,是.NET反射的设计特性——对于不可为null的值类型,当默认参数值是default(T)时,编译器不会在元数据中存储具体的默认值,反射时就会返回null来表示“使用该类型的默认值”。

要可靠获取任意类型参数的默认值,可以按以下逻辑处理:

  • 先通过HasDefaultValue确认参数确实有默认值
  • 如果DefaultValue不为null,直接返回该值
  • 如果DefaultValue为null,但参数类型是不可为null的值类型,就创建该类型的默认实例(等价于default(T))

下面是封装好的工具方法:

public static object GetParameterDefaultValue(ParameterInfo parameter) {
    if (!parameter.HasDefaultValue) {
        throw new InvalidOperationException("该参数没有默认值");
    }

    object defaultValue = parameter.DefaultValue;
    Type paramType = parameter.ParameterType;

    // 处理不可为null的值类型的默认值情况
    if (defaultValue == null 
        && paramType.IsValueType 
        && Nullable.GetUnderlyingType(paramType) == null) {
        return Activator.CreateInstance(paramType);
    }

    return defaultValue;
}

把这个方法用到你的示例里,就能正确获取到Guid.Empty了。

补充说明:

  • 对于引用类型和可空值类型,DefaultValue的返回符合预期:引用类型默认返回null,可空值类型默认也返回null
  • Activator.CreateInstance(paramType)等价于default(T),因为值类型的无参构造函数就是返回默认值

内容的提问来源于stack exchange,提问作者DaleStan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 01:13:14