本当に文字列にしたい場合は、メソッドの開始時に検証するだけです。
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
}