【问题标题】:Is it possible in C# to require exactly one of two parameters, to be passed in to the method?在 C# 中是否可能需要两个参数之一才能传递给方法?
【发布时间】:2014-08-09 22:08:57
【问题描述】:

考虑,

public void Test(Type1 param1, Type2 param2)
{
   //...
}

我想知道在 C# 中是否有可能要求在调用 Test 时它必须只包含一个参数。 IE。 Test(param1)Test(param2)(其中 param1param2 的类型分别为 Type1Type2。它应该不能调用 Test(param1, param2)

我的目的是强制执行限制,所以使用可选参数对我不起作用。

由于每个人都不清楚这个问题,请考虑以下示例:

public void Test(int age, DateTime dob)
{
   //
}

我只需要一个参数来确定年龄。那么是否可以限制方法 Test 的调用,使得它只能使用 EXACTLY 一个参数调用,即 agedob,但不应同时调用它。

【问题讨论】:

  • 你的问题我还是不清楚。假设你正在搜索方法重载

标签: c# methods parameters restriction


【解决方案1】:

我建议你使用重载方法:

public void Test(Type1 param1)
{
   this.Test(param1, null);
}

public void Test(Type2 param2)
{
   this.Test(null, param2);
}


private void Test(Type1 param1, Type2 param2)
{
   //...
}

如果类型推断没有问题,您将没有问题。

编辑

在您的情况下,您会遇到一些问题 - 您的参数是结构(它们不能为空)。在这种情况下,您将不得不使用 this.Test(default(Type1), param2); 这将在方法内部带来更多问题 - 我们如何区分 0(default(int)) 的值是被赋予方法还是作为默认值和应该改用dateOfBirth

我不认为可选参数会有所帮助,因为只有正确的参数是可选的,自动值和用户给定值之间的区别问题仍未解决,而代码协定可能有用:

public void Test(Type1 param1, Type2 param2)
{
    Contracts.Requires((param1 == null && param2 != null) || (param1 != null && param2 == null),       "Only one parameter is needed");
    // ...
}

但我不确定您为什么真的需要这样的解决方案(具有两个间歇性可选参数的方法)。您将不得不处理其中一个参数为空(或默认结构)这一事实 - 最多可以再增加一个分支来增加 Test(Type1 param1, Type2 param2) 的复杂性。我建议您使用两种单独的单参数方法:

public void CheckSomeAgeRelatedInfo(int age)
{
   //
}


public void CheckSomeAgeRelatedInfo(DateTime dateOfBirth)
{
   //
}

【讨论】:

    猜你喜欢
    • 2019-12-14
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    相关资源
    最近更新 更多