如何在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
相关产品推荐
相关产品推荐

