4

私は次のコードを持っています:

public class Class1
{
    void ValueSpecific(string arg)
    {
        // do string stuff
    }
    void ValueSpecific(int arg)
    {
        // do int stuff
    }
    void ValueSpecific(float arg)
    {
        // do float stuff
    }
    void ValueGeneric(string arg)
    {
        // do stuff
        ValueSpecific(arg);
        // do more stuff
    }
    void ValueGeneric(int arg)
    {
        // do stuff
        ValueSpecific(arg);
        // do more stuff
    }
    void ValueGeneric(float arg)
    {
        // do stuff
        ValueSpecific(arg);
        // do more stuff
    }
    void Main(string s, int i, float f)
    {
        ValueGeneric(s);
        ValueGeneric(i);
        ValueGeneric(f);
    }
}

これは機能しますが、ValueGenericの3つのオーバーロードすべての本体は同じです。それらを1つのメソッドに統合したいのですが、次のようになります。

void ValueGeneric<T>(T arg) where T: string, float, int
{
    // do stuff
    ValueSpecific(arg);
    // do more stuff
}

しかし、もちろん、これは有効なC#ではありません。私が思いつくことができる最高のものは次のとおりです。

void ValueGeneric(object arg)
{
    // Do stuff
    if (arg is int)
    {
        ValueSpecific((int)arg);
    }
    else if (arg is string)
    {
        ValueSpecific((string)arg);
    }
    else if (arg is float)
    {
        ValueSpecific((float)arg);
    }
    else
    {
        Debug.Assert(false, "Invalid type)
    }
    // Do more stuff
}

しかし、これは非常にエレガントではないようです。何か提案をいただければ幸いです。(私はどのソリューションにも興味がありますが、私が使用しているのは.NET3.5でサポートされているソリューションが最適です。)

4

3 に答える 3

2

すべてのオーバーロードの前後で同じことをしていると仮定すると、コードの違いを因数分解してパラメーター化するという通常のアプローチを適用できます。変更されるのは、渡される引数と、その引数に対して実行するアクションだけです。両方を渡します。

static void ValueGeneric<T>(T arg, Action<T> action)
{
    // do stuff
    action(arg);
    // do more stuff
}

次に、適切なアクションを使用してジェネリックメソッドを呼び出します(ValueSpecificオーバーロードは自動的に解決されます)。

ValueGeneric(s, ValueSpecific);
ValueGeneric(i, ValueSpecific);
ValueGeneric(f, ValueSpecific);
于 2012-07-21T09:05:32.717 に答える
0

他の大規模な.NETプロジェクトについて私が見たものから、特定のオーバーロードと一般的なオーバーロードの両方を含めることができます。特定のオーバーロードが存在しない場合は、代わりに汎用バージョンを使用します。

void ValueGeneric(int i);
void ValueGeneric(string s);
void ValueGeneric(float f);
void ValueGeneric<T>(T t);

投稿したコードの構造からすると、の内容の前後のすべての型に何かをしたいようです。そのため、すべてのオーバーロードが最初と最後に呼び出すValueSpecificプライベートメソッドPreValueGenericとメソッドを作成して、コード間の重複を避けることができます。過負荷。PostValueGenericValueGeneric

于 2012-07-21T09:08:47.283 に答える
0

タイプごとに拡張方法を使用することを検討しましたか?これは、この場合の代替手段になる可能性があります。

クラスを定義し、そのメソッドを定義できます。好き:

namespace ExtensionMethods
{
    public static class Class1
    {
        static void ValueSpecific(this string arg)
        {
            // do string stuff
        }
        static void ValueSpecific(this int arg)
        {
            // do int stuff
        }  
    }
}

そして、それらを使用したいときは、

Int32 myIntVar = 20;
myIntVar.ValueSpecific();
String myStringVar = "hi",
myStringVar.ValueSpecific();

追加する必要があります

using ExtensionMethods;

メソッドを宣言して使用するだけです。

于 2012-07-21T09:40:47.973 に答える