在我的通用界面中,我有一个具有可选参数的函数。我是这样编写的,试图遵循DRY( D on R epeat Y 我们自己)。虽然这个功能有效,但我在功能中有逻辑来处理尽可能多的假设,但我觉得这个工作是不完整的,除非我能够强制正确使用这个方法。
我想要做的是强制执行一条规则,以便将前两个参数用作一对或使用第三个参数 - 从不同时使用。我将其设置为使一个功能适用于尽可能多的情况。虽然我可以编写此函数的不同重载以确保正确使用它,但我想确保函数定义中没有任何内容可以确保强制执行参数使用而无需实际编写两个相同功能的变体。
我回到基础并看了C# Programming Guide,当我发现一些有用的复习时,我没有看到任何与此问题有关的内容。
是否有办法强制执行此规则内联,或者创建单独的重载是强制执行此规则的唯一方法?
IQueryable<TEntity> GetByFilter(
string byWhereColumn=null, string byWhereValue = null,
string byWhereString = null,
string byOrder = null,
string byDir = null
);
答案 0 :(得分:5)
根据我的评论,我认为你需要使用单独的重载,我知道你不想重复代码,但是到目前为止你只能简化它,如果有必要,重载方法,构造函数等不重复。
MyMethod (param1, param2){...
MyMethod (param3){...
答案 1 :(得分:2)
要将参数用量指示为对,您可以使用元组,或者甚至更好的特定类来强制使用一对。这也适用于已经加入的答案:
元组示例:
public IQueryable<TEntity> GetByFilter(
Tuple<String, String> byWhereValueAndColumn = null,
string byWhereString = null,
string byOrder = null,
string byDir = null
);
课程示例:
public IQueryable<TEntity> GetByFilter(
ColumnAndValue byWhere = null,
string byWhereString = null,
string byOrder = null,
string byDir = null
);
public class ColumnAndValue {
public String Column { get; private set; }
public String Value { get; private set; }
public ColumnAndValue(string column, string value) {
Column = column;
Value = value;
}
}
当然,API用户仍然可以将任何一对参数设置为null,但这样您至少可以非常强烈地指出应该如何使用API。