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

如何合并操作Kentico不同Query对象但代码重复的C#方法?

合并重复方法的最佳方案

嘿,很高兴看到你在优化重复代码——这绝对是个好习惯!针对你现在的情况,DocumentQuery和MultiDocumentQuery在Kentico里共享了相同的查询方法(比如你用到的WhereEquals),我们可以用泛型方法来完美合并这两个重复的逻辑,同时保留强类型检查。

最优方案:泛型+基类约束

Kentico的DocumentQuery和MultiDocumentQuery都继承自DocumentQueryBase<TQuery, TreeNode>基类,这个基类正好提供了你需要的WhereEquals方法。我们可以基于这个基类构建泛型方法:

private static TQuery SetQueryMainFilters<TQuery>(DocumentQueryObject documentQuery, TQuery repeaterQuery) 
    where TQuery : DocumentQueryBase<TQuery, TreeNode>
{
    if (documentQuery.NodeID > 0)
    {
        repeaterQuery.WhereEquals(KenticoConstants.NODE_ID, documentQuery.NodeID);
    }
    if (documentQuery.DocumentID > 0)
    {
        repeaterQuery.WhereEquals(KenticoConstants.DOCUMENT_ID, documentQuery.DocumentID);
    }
    return repeaterQuery;
}

为什么这么改?

  • 去掉了冗余的out参数:因为Kentico的查询对象是可变实例,你在方法里修改的是原对象本身,直接返回修改后的实例更符合C#的编码习惯
  • 泛型约束保证了类型安全:只有继承自DocumentQueryBase的类型才能传入,编译时就能检查出错误
  • 完全兼容两种查询对象:不管是DocumentQuery还是MultiDocumentQuery,都可以直接调用这个方法

调用示例

修改后的调用代码会更简洁:

public static MultiDocumentQuery RepeaterMultiDocumentQuery(DocumentQueryObject documentQuery) 
{
    MultiDocumentQuery repeaterQuery = new MultiDocumentQuery();
    // ... 你的其他查询构建逻辑
    repeaterQuery = SetQueryMainFilters(documentQuery, repeaterQuery);
    return repeaterQuery;
}

针对DocumentQuery的调用也完全一样,直接传入对应的实例即可,不需要额外写重载方法。

备选方案:动态类型(不推荐长期使用)

如果你暂时不确定具体的基类/接口,也可以用动态类型临时过渡,但这种方式会失去编译时类型检查,容易引发运行时错误,只建议作为临时方案:

private static dynamic SetQueryMainFilters(DocumentQueryObject documentQuery, dynamic repeaterQuery)
{
    if (documentQuery.NodeID > 0)
    {
        repeaterQuery.WhereEquals(KenticoConstants.NODE_ID, documentQuery.NodeID);
    }
    if (documentQuery.DocumentID > 0)
    {
        repeaterQuery.WhereEquals(KenticoConstants.DOCUMENT_ID, documentQuery.DocumentID);
    }
    return repeaterQuery;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:40:07