如何在类中定义可接收泛型类型的IMongoCollection静态变量
实现方案
利用C#泛型静态类的原生特性:不同泛型类型参数构造出的封闭类,会持有独立的静态变量副本,不需要额外定义外部可访问类,完全适配你的需求。
示例代码
public static class MongoUtil { // 私有嵌套泛型类,仅内部可见,不属于额外定义的外部可访问类 private static class CollectionHolder<TDoc> { public static IMongoCollection<TDoc> Instance; } public async Task Connect<TDoc>(string connectionString, string database, string collection) { // 保留原有连接、获取数据库逻辑 var mongoClient = new MongoClient(connectionString); var connectedDatabase = mongoClient.GetDatabase(database); // 直接存入对应TDoc的静态变量中,完全保留强类型信息 CollectionHolder<TDoc>.Instance = connectedDatabase.GetCollection<TDoc>(collection); // 原有其他业务逻辑保留 } // 对外提供强类型集合获取入口 public static IMongoCollection<TDoc> GetCollection<TDoc>() { return CollectionHolder<TDoc>.Instance; } }
使用方式
- 初始化指定类型集合
// 初始化对应业务文档类型的集合连接 await new MongoUtil().Connect<Order>("mongodb://127.0.0.1:27017", "ShopDb", "Orders");
- 全局获取强类型集合
// 任意位置调用,直接拿到对应类型的IMongoCollection实例,无需类型转换 var orderCollection = MongoUtil.GetCollection<Order>(); // 直接使用MongoDB强类型查询API var paidOrders = await orderCollection.Find(o => o.IsPaid == true).ToListAsync();
方案优势
- 完全强类型,无需使用
object作为泛型参数,不会丢失类型信息,也无需额外类型转换 - 没有额外定义外部可访问类,嵌套的
CollectionHolder是私有内部类,仅工具类内部可见 - 支持同时存储多个不同文档类型的集合实例,不同
TDoc对应的集合互不干扰
内容的提问来源于stack exchange,提问作者michaelukz
相关产品推荐
相关产品推荐

