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

How to add optional parameters to C#-Method

我有一个搜索员工的方法。该方法有很多可选参数作为搜索参数。我的 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。

有没有通用的方法来处理这种情况?

澄清

1。 我只是向现有方法添加两个新的可选参数来扩展它: 由于签名更改,所有调用程序都出现 Missing-Method Exception。

2。 我重载了方法。现在编译器无法区分重载和方法。我很清楚这一点。有人可以调用 Search(active: true); .Net 应该采用哪种方法?

问题可能出在您的可选参数的位置。 它似乎正在编译 "for some reason" 但这不应该起作用。

作为解决方法,您应该修改所需的版本:

public virtual List<IEmployee> Search(int? personalNr = null, bool? active = null, DateTime? dateOfBirth, string firstName = null, string lastName = null)

也保留旧方法,但将代码从 "basic" 版本移至重载版本。当调用 "basic" 搜索时,只需调用您的搜索方法并将 firstName 和 lastName 设置为空参数。

编辑:刚刚看到你的编辑,我的 post 没有多大意义 :)

从我的角度来看,最好的方法是:

  • 声明一个需要所有参数并管理每个参数是否为空的私有方法。
  • 为每个可能的参数数量声明一个 public 方法
  • 每个public方法调用私有方法将缺失参数转换为空参数。

在我看来,我不认为使用可选参数是个好主意

嘿,谢谢你们的回复。我的问题是我不想影响外面的程序。所以我决定创建一个新的 class SearchParams。这包含列出的所有参数。所以我可以重载我现有的方法并将 SearchParams 作为参数传递。我将设置旧方法 Obsolete。 SearchParams class 可以自由扩展。

变化:

像这样创建新的 class:

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)

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

这是另一个建议。

您可以从旧方法中删除 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);

这将执行您的新方法。

但是,如果我处于你的位置,我会直接重命名旧方法。