如何在C#中设置参数的定义值

本文关键字:参数 定义 设置 | 更新日期: 2023-09-27 18:00:00

如何设置参数的定义值?我的意思是,例如,我有以下功能:

int functionA(string parameterA) {}

现在,当我调用这个函数并输入参数A的值时,我希望该值在我定义的值集中。例如,定义的值集为:

string[] definedParameterA = { "Hello World", "stackoverflow" };

参数AI输入的值必须是"Hello World"或"stackoverflow"。

如何在C#中设置参数的定义值

如果你真的希望它是一个字符串,你只需要在方法的开头验证它:

private static readonly String[] ValidValues = {"Hello World", "stackoverflow"};
public void DoSomething(string text)
{
    if (!ValidValues.Contains(text))
    {
        throw new ArgumentException("Invalid value: " + text, "text");
    }
    // Carry on
}

但是,您也可以考虑使用枚举。您仍然需要验证枚举值是否已定义,但它使调用方更容易正确地进行操作:

public enum Message
{
    HelloWorld,
    StackOverflow
}
public void DoSomething(Message message)
{
    if (!Enum.IsDefined(typeof(Enum), message))
    {
        throw new ArgumentException("Invalid value: " + message, "message");
    }
    // Carry on
}

当然,如果需要的话,可以在其他地方进行从枚举值到字符串的映射。

请注意,上面的代码将在每次调用时框选message。如果真的想要的话,你可以使用我的Unconstrained Melody项目来避免这种情况(并使其更加类型安全),但在你证明这种拳击实际上是一个问题之前,这可能是不值得的。代码看起来是这样的:

public void DoSomething(Message message)
{
    if (!message.IsNamedValue()) // Extension method
    {
        throw new ArgumentException("Invalid value: " + message, "message");
    }
    // Carry on
}

也许静态类可以帮助您。

public static class MyValidParameters
{
    public static const string HelloWorld = "Hello World";
    public static const string Stackoverflow = "stackoverflow";
    //
}

因此,您可以拥有任何类型的复杂参数(不仅仅是字符串),并且可以在不同的静态类中管理它们。

我想用最通用的术语重新表述John Skeet的答案:

你正在使用字符串。字符串是一种无界类型,可以包含几乎无限的可能值,从null"",再到莎士比亚全集。如果您只期望少数可能的值,那么无界数据类型可能不是您的正确选择。也许您可以将其替换为有界数据类型?

正如John Skeet所示,系统中内置的最简单的有界数据类型是Enums。它们提供了一组封闭的可能值。因此,你可以获得你的输入,将其映射到值列表中,并从现在开始使用它。然而,也有一些复杂的问题。第一个是约翰·斯基特提到的可能的履约处罚。第二个问题是,并非所有字符串都可以表示为枚举值。例如,"Hello World"不是一个有效的C#标识符,因此很难将其映射到枚举中。

这可以通过用[Description("Hello world")][DisplayName("Hello world")]属性装饰枚举值并使用反射来匹配它来实现,但这会带来性能损失。在这种情况下,您可能会考虑使用某种静态实用程序将字符串映射到枚举值。