我有一种搜索员工的方法。该方法获得了许多可选参数作为搜索参数。我的Api在我们系统中的许多单个程序中使用,我想为它添加两个新的可选参数。如果我这样做编译器是好的,但我的api的使用程序正在获得方法缺少异常。好吧我明白到目前为止,因为实习生旧方法不存在(参数列表不同)。现在我觉得我很容易超负荷。但是现在编译器肯定不能区分我的两种方法(旧的和重载的)。
小例子:
旧版本:
public virtual List<IEmployee> Search(int? personalNr = null, bool? active = null, DateTime? dateOfBirth = null)
所需-版本:
public virtual List<IEmployee> Search(int? personalNr = null, bool? active = null, DateTime? dateOfBirth = null, string firstName = null, string lastName = null)
只想添加两个参数。我知道我可以使用dll编译所有,但是这个API用得很大,我不想在Live-System上传输所有的dll。
有没有一种常见的方法来处理这种情况?
CLARIFY
1。 我只是向现有方法添加两个新的可选参数来扩展它: 由于签名已更改,所有调用程序都会收到Missing-Method Exception。
2。
我重载了这个方法。现在编译器不能区分重载和方法。这对我来说很清楚。有人可以调用Search(active: true);
.Net采用哪种方法?
答案 0 :(得分:0)
从我的观点来看,最好的方法是:
从我的观点来看,我不认为使用选择性参数是一个好主意
答案 1 :(得分:0)
这是另一个建议。
您可以从旧方法中删除optional
个参数。强制要求所有参数。
public virtual List<object> Search(int? personalNr, bool? active, DateTime? dateOfBirth)
{
}
然后在第二种方法中创建所有参数optional
。
public virtual List<object> Search(int? personalNr = null, bool? active = null, DateTime? dateOfBirth = null, string firstName = null, string lastName = null)
{
}
现在假设您正在调用此方法;
Search(1,true, DateTime.Now);
以上将执行您的旧方法。
Search(1,true, DateTime.Now, null);
这将执行您的新方法。
但是,如果我在你的位置,我会重新命名旧方法。
答案 2 :(得分:-1)
问题可能来自可选参数的位置。 它似乎是“出于某种原因”进行编译,但这不应该起作用。
作为解决方法,您应该修改所需的版本:
public virtual List<IEmployee> Search(int? personalNr = null, bool? active = null, DateTime? dateOfBirth, string firstName = null, string lastName = null)
保留旧方法,但将代码从“基本”版本移动到重载版本。当调用“基本”搜索时,只需调用搜索方法并将firstName和lastName作为空参数。
编辑:刚刚看到你的编辑,我的帖子没有多大意义:)
答案 3 :(得分:-1)
SearchParams
。这包含列出的所有参数。所以我可以重载我现有的方法并传递SearchParams
作为参数。我将设置旧方法Obsolete
。 SearchParams类可以自由扩展。
的变化:
像这样创建新类:
public class SearchParams
{
public int? PersonalNr{get;set;}
public bool? Active {get;set;}
public DateTime? DateOfBirth{get;set}
public string FirstName{get;set;}
public string LastName{get;set;}
}
重载搜索方法:
public List<IEmployee> Search(SearchParams paramList)
因此调用者首先创建参数并将其传递给搜索。 在我看来,这似乎是最好的方式。