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

C#如何通过反射动态获取派生类的ErrorCode、ErrorName等属性值

问题根源

你的代码存在3个核心错误:

  • 调用GetAllDerivedTypes时传入的基类类型是ExceptionBase,和你实际定义的基类BaseClass不匹配,会查不到任何派生类
  • 所有派生类都没有定义无参构造函数,你用Type.EmptyTypes查找无参构造函数必然返回null
  • 你的目标是读取ErrorCode、ErrorName属性值,完全不需要获取构造函数对象,逻辑走偏

解决方案

你只需要正确实例化派生类,就可以直接读取属性值。由于你定义的ErrorCode、ErrorName是和构造参数无关的固定值,实例化时构造参数传默认占位值即可。

实现代码

// 1. 修正基类类型,获取所有派生类
var listOfDerived = GetAllDerivedTypes(typeof(BaseClass));
foreach (var derivedType in listOfDerived)
{
    // 2. 匹配构造函数参数,传默认占位值
    BaseClass instance = null;
    if (derivedType == typeof(Concrete1))
    {
        instance = Activator.CreateInstance(derivedType, 0, string.Empty) as BaseClass;
    }
    else if (derivedType == typeof(Concrete2))
    {
        instance = Activator.CreateInstance(derivedType, 0, 0, string.Empty) as BaseClass;
    }

    if (instance != null)
    {
        // 3. 直接读取属性值
        int errorCode = instance.ErrorCode;
        string errorName = instance.ErrorName;
        Console.WriteLine($"类名:{derivedType.Name},错误码:{errorCode},错误名:{errorName}");
    }
}

通用优化方案(不需要匹配构造函数)

如果后续会新增更多派生类,不想每次新增都修改构造参数匹配逻辑,可以把固定的错误码、错误名放到特性中,不需要实例化就能读取:

  1. 先定义特性类
[AttributeUsage(AttributeTargets.Class)]
public class ErrorInfoAttribute : Attribute
{
    public int ErrorCode { get; }
    public string ErrorName { get; }
    public ErrorInfoAttribute(int errorCode, string errorName)
    {
        ErrorCode = errorCode;
        ErrorName = errorName;
    }
}
  1. 给派生类加特性
[ErrorInfo(1022, "NotFound")]
public class Concrete1 : BaseClass
{
    // 原有逻辑不变
}
[ErrorInfo(1023, "NotSettle")]
public class Concrete2 : BaseClass
{
    // 原有逻辑不变
}
  1. 直接读取特性值,无需实例化
var listOfDerived = GetAllDerivedTypes(typeof(BaseClass));
foreach (var derivedType in listOfDerived)
{
    var errorInfo = derivedType.GetCustomAttribute<ErrorInfoAttribute>();
    if (errorInfo != null)
    {
        int errorCode = errorInfo.ErrorCode;
        string errorName = errorInfo.ErrorName;
        Console.WriteLine($"类名:{derivedType.Name},错误码:{errorCode},错误名:{errorName}");
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 23:57:03