如何向 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);
这将执行您的新方法。
但是,如果我处于你的位置,我会直接重命名旧方法。
我有一个搜索员工的方法。该方法有很多可选参数作为搜索参数。我的 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);
这将执行您的新方法。
但是,如果我处于你的位置,我会直接重命名旧方法。