如何将可选参数添加到C#-Method

时间:2015-11-30 09:54:13

标签: c# parameters optional-parameters

我有一种搜索员工的方法。该方法获得了许多可选参数作为搜索参数。我的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采用哪种方法?

4 个答案:

答案 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)

因此调用者首先创建参数并将其传递给搜索。 在我看来,这似乎是最好的方式。