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

如何在C#中设置参数的定义值?,c#,C#,如何设置参数的定义值?我的意思是,例如,我有以下功能: int functionA(string parameterA) {} 现在,当我调用这个函数并输入参数值时,我希望该值位于我定义的值集中。例如,定义的值集为: string[] definedParameterA = { "Hello World", "stackoverflow" }; 参数I输入的值必须是“Hello World”或“stackoverflow”。如果您真的希望它是字符串,只需在方法的开头验证它: private

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

int functionA(string parameterA) {}
现在,当我调用这个函数并输入参数值时,我希望该值位于我定义的值集中。例如,定义的值集为:

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

参数I输入的值必须是“Hello World”或“stackoverflow”。

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

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
}
当然,如果您愿意,您可以在其他地方拥有从枚举值到字符串的映射

请注意,上述代码将在每次通话时显示在
消息框中。如果您真的愿意,您可以使用我的项目来避免这种情况(并使其更加类型安全),但在您证明这种限制实际上是一个问题之前,这可能是不值得的。代码将如下所示:

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

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

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
}
当然,如果您愿意,您可以在其他地方拥有从枚举值到字符串的映射

请注意,上述代码将在每次通话时显示在
消息框中。如果您真的愿意,您可以使用我的项目来避免这种情况(并使其更加类型安全),但在您证明这种限制实际上是一个问题之前,这可能是不值得的。代码将如下所示:

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";
    //
}

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

也许静态类可以帮助您

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

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

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

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

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


这可以通过使用
[Description(“Hello world”)]
[DisplayName(“Hello world”)]
属性装饰枚举值并使用反射来匹配它来实现,但这有其自身的性能损失。在这种情况下,您可以考虑使用某种静态工具将字符串映射到枚举值。

< P>我想用最一般的术语重新表述John Skeet的回答:

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

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


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

<代码> AgUMutOutOfRangeExabor < /代码>也是一种可能抛出的类型。@ JPPSPurnelels:是的,我考虑过了。可能比字符串版本更适合枚举版本。
ArgumentOutOfRangeException
也是可以抛出的类型。@JeppeStigNielsen:是的,我考虑过。可能比字符串版本更适合枚举版本。