如何合并操作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
相关产品推荐
相关产品推荐

