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

如何在类中定义可接收泛型类型的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 00:03:00