3

C#コンパイラがToLower()(または他の操作メソッドの呼び出し)をメソッド内で使用される前に特定のメソッドパラメータに自動的に適用するようにする方法はありますか?

//追加情報:その目的は、大文字と小文字を区別しないキーで辞書を使用することです。どうやら、私の最初のアプローチは完全に間違っていました。なぜなら、アクセスされるキーではなく、辞書自体に対処するまったく異なるアプローチをすでに見つけたからです。

私の悪い!私はあなたにその情報を提供すべきだった。したがって、これ以上の回答は必要ありません。とにかく、どうもありがとう!

この特定の場合のより良いアプローチ:c#ディクショナリ:宣言によってキーを大文字と小文字を区別しないようにする

4

4 に答える 4

10

いいえ、C#コンパイラはこれを行いません(なぜそのような特定の要件に合わせて調整する必要があるのですか?)が、単純なラッパーを作成することでこれを行うことができます:structstring

struct LowerCaseString
{
    public LowerCaseString(string value)
    {
        this.value = value.ToLower();
    }

    private readonly string value;

    public static implicit operator LowerCaseString(string value)
    {
        return new LowerCaseString(value);
    }

    public override string ToString()
    {
        return value;
    }

    … // perhaps implement IEquatable<>, IComparable<>, etc.
}

暗黙的な変換演算子を使用すると、次のようなコードを記述できます。

Foo("Hello world.");

void Foo(LowerCaseString text)
{
    Console.WriteLine(text);
}

これは期待どおりに機能しますが、このアプローチにはいくつかの欠点があります。

  • ラッパーオブジェクトを文字列の周囲でインスタンス化する必要があるため、パフォーマンスへの影響はごくわずかです(おそらく無視できる程度です)。

  • コードの他のユーザーには、暗黙の変換演算子が存在することが明らかでない場合があるため、new LowerCaseString("Hello world.")代わりに書き込みを行うことになります。Visual Studioのオブジェクトブラウザーでクラスを見ると、チームが定期的に使用している場合、この問題が解決する可能性があります。

  • CultureInfoこのラッパーでは、の使用を指定することはできません.ToLower()CurrentCulture、、、またはその他を使用しますInvariantCultureか?

于 2013-03-24T09:11:03.780 に答える
4

ある種のAOPを使用せずに、いいえ。

PostSharpはそのようなツールの1つですが、複雑さが増し、コードが隠され、コンパイル時間が大幅に長くなります。

メソッド内ToLowerのパラメーターに直接適用するか、メソッドへのすべての呼び出しを事前に呼び出すメソッドでラップする方がはるかに簡単です。ToLower

于 2013-03-24T09:04:44.967 に答える
3

PostSharpのようないくつかのAOPツールはそれを行うことができます。

しかし、これが本当にあなたが望むものであり、より簡単でクリーンな方法がないことを2回確認してください。

于 2013-03-24T09:04:08.063 に答える
0

他の人が提案したように、これを行うことができます-AOPを介して。ただし、小文字の文字列のみを渡す場合は、これは複雑になりすぎて、(私の意見では)努力する価値がありません。

あなたはその問題についてもっと多くの情報を提供するべきですが、あなたの目標を達成するためのより簡単な方法があると私は信じています。組み込みの文字列比較クラスを見てStringComparer.OrdinalIgnoreCaseください。比較のために小文字の文字列が必要な場合は、目的に合うかもしれません。文字列を小文字でユーザーに表示する必要がある場合、これは文字列を表示するコードの責任であり、ビジネスロジックの責任ではありません。

于 2013-03-24T09:14:35.807 に答える