当前位置: 首页 > ops >正文

C#强类型枚举的入门理解

前言

在学习QFramework框架底层逻辑时,发现有两处代码不理解:

mArchitecture.mContainer.GetInstancesByType<IModel>().Where(m => !m.Initialized)
public IEnumerable<T> GetInstancesByType<T>()
{var type = typeof(T);return mInstances.Values.Where(instance => type.IsInstanceOfType(instance)).Cast<T>();
}

此处用到C#强类型枚举(Strongly Typed Enumeration)相关知识。

强类型枚举的含义

在 C# 中,强类型枚举并不是一个官方的术语,但它通常用来描述 通过泛型约束或类型转换,确保集合中的元素具有明确的类型而不是笼统的 object 或动态类型

.Cast<T>() 的作用

在 GetInstancesByType<T> 方法中,.Cast<T>() 的作用就是将筛选出的 object 实例转换为具体的类型 T,从而返回一个 类型安全的集合IEnumerable<T>)。

为什么需要强类型枚举?

1)弱类型的缺陷

假设有一个非泛型的容器,存储的是 object 类型:

List<object> instances = new List<object> { new PlayerModel(), new EnemyModel() };

当你从 instances 中取出元素时,默认是 object 类型:

var model = instances[0]; // 类型是 object,无法直接调用 PlayerModel 的方法

必须手动强制转换:

var player = (PlayerModel)instances[0]; // 不安全,可能抛出 InvalidCastException

2)避免弱类型缺陷的解决方案

通过 Cast<T>() 或 OfType<T>(),可以直接获取 T 类型的集合:

IEnumerable<IModel> models = instances.Cast<IModel>(); // 所有元素都是 IModel 类型
  • 优势
    • 编译时类型检查,避免运行时转换错误。
    • 可以直接调用 T 类型的方法,无需额外转换。

那么GetInstancesByType<T> 是如何实现强类型枚举的呢?

public IEnumerable<T> GetInstancesByType<T>()
{var type = typeof(T);return mInstances.Values.Where(instance => type.IsInstanceOfType(instance)) // 筛选符合 T 类型的实例.Cast<T>(); // 转换为 IEnumerable<T>
}
  • Where 筛选:确保所有元素都符合 T 类型(如 IModel)。
  • Cast<T> 转换:将 object 转换为 T,使返回的集合可以直接使用 T 的方法。

示例代码

###假设 `mInstances` 存储了以下对象:
mInstances = {{ typeof(PlayerModel), new PlayerModel() },{ typeof(EnemyModel), new EnemyModel() },{ typeof(InputSystem), new InputSystem() }
}###调用 `GetInstancesByType<IModel>()`:
##1. 筛选出所有 `IModel` 实例(`PlayerModel` 和 `EnemyModel`)。
##2. 使用 `Cast<IModel>()` 返回 `IEnumerable<IModel>`:
IEnumerable<IModel> models = GetInstancesByType<IModel>();
foreach (var model in models)
{model.Init(); // 可以直接调用 IModel 的方法
}

 

 Cast<T>()比对OfType<T>()

方法行为是否抛出异常
Cast<T>()强制转换,要求所有元素必须是 T 类型如果元素不是 T 类型,抛出 InvalidCastException
OfType<T>()安全筛选,只返回符合 T 类型的元素不会抛出异常,不符合的元素会被忽略

在 GetInstancesByType<T> 中:

  • 由于已经用 Where 确保所有元素符合 T 类型,所以 Cast<T> 是安全的。
  • 如果担心潜在的类型问题,可以用 OfType<T> 替代:
return mInstances.Values.OfType<T>();

 

总结

  • 强类型枚举:通过泛型或 Cast<T>/OfType<T>,让集合的元素具有明确的类型,避免手动转换。
  • GetInstancesByType<T> 的作用
    1. 从容器中筛选出所有符合 T 类型的实例。
    2. 返回 IEnumerable<T>,使调用方可以直接使用 T 类型的方法。
  • 适用场景
    • 依赖注入容器(如 QFramework 的 IOCContainer)。
    • 需要按类型动态查询对象的场景。
http://www.xdnf.cn/news/6168.html

相关文章:

  • C++矩阵操作:正交矩阵(旋转矩阵)
  • 级联与端到端对话系统架构解析:以Moshi为例
  • 材料×工艺×AI:猎板PCB重构汽车电子四层板技术逻辑
  • 基于大模型的TIA诊疗全流程智能决策系统技术方案
  • 经典还原反应解析:Wolff-Kishner机制与黄鸣龙改进法
  • DeepSeek部署中常见的问题及解决方案
  • 在 Android 的`Handler` 和 `Binder
  • 学前数学思维:等量代换
  • 多因子线性回归实战
  • fiftyone-dataset使用基础
  • 零基础学Java——终章:核心知识点与面试总结
  • Vue百日学习计划Day4-8——Gemini版
  • 从 Vue3 回望 Vue2:逻辑复用新思维——从 Mixins 到 Composables
  • 基于EFISH-SCB-RK3576/SAIL-RK3576的智能零售柜技术方案
  • 「数学::博弈论」Nim游戏(尼姆游戏)/ Luogu P2197(C++)
  • 高压启动电路--学习记录
  • 反向操作:如何用AI检测工具优化自己的论文“人味”?
  • Lightpanda开源浏览器:专为 AI 和自动化而设计的无界面浏览器
  • 小白月赛——命运之弹
  • python:mitmproxy代理服务搭建
  • C——俄罗斯方块
  • Android 适配之——targetSdkVersion 30升级到31-34需要注意些什么?
  • 使用spring ai实现简单会话
  • PHP 编程:现代 Web 开发的基石与演进
  • 基于EMD-PCA-LSTM的光伏功率预测模型研究
  • 京东回应外卖业务中期目标:聚焦协同与体验,布局长远发展
  • 洞若观火 - 服务网格的可观测性魔法 (Istio 实例)
  • 第二十八节:直方图处理- 直方图计算与绘制
  • 使用termius连接腾讯云服务器
  • 使用Docker部署MongoDB