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}"); } }
通用优化方案(不需要匹配构造函数)
如果后续会新增更多派生类,不想每次新增都修改构造参数匹配逻辑,可以把固定的错误码、错误名放到特性中,不需要实例化就能读取:
- 先定义特性类
[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; } }
- 给派生类加特性
[ErrorInfo(1022, "NotFound")] public class Concrete1 : BaseClass { // 原有逻辑不变 } [ErrorInfo(1023, "NotSettle")] public class Concrete2 : BaseClass { // 原有逻辑不变 }
- 直接读取特性值,无需实例化
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
相关产品推荐
相关产品推荐

