4

int、float、bool、または string として表すことができる 2 つのオブジェクトがあります。これら 2 つのオブジェクトに対して追加を実行する必要があり、結果は c# が結果として生成するものと同じになります。たとえば、1+"Foo" は文字列 "1Foo" に等しく、2+2.5 は float 5.5 に等しく、3+3 は int 6 に等しくなります。現在、私は以下のコードを使用していますが、信じられないほどやり過ぎのようです。誰かがこれを効率的に行う方法を単純化または指摘できますか?

private object Combine(object o, object o1) {
    float left = 0;
    float right = 0;

    bool isInt = false;

    string l = null;
    string r = null;
    if (o is int) {
        left = (int)o;
        isInt = true;
    }
    else if (o is float) {
        left = (float)o;
    }
    else if (o is bool) {
        l = o.ToString();
    }
    else {
        l = (string)o;
    }

    if (o1 is int) {
        right = (int)o1;
    }
    else if (o is float) {
        right = (float)o1;
        isInt = false;
    }
    else if (o1 is bool) {
        r = o1.ToString();
        isInt = false;
    }
    else {
        r = (string)o1;
        isInt = false;
    }

    object rr;

    if (l == null) {
        if (r == null) {
            rr = left + right;
        }
        else {
            rr = left + r;
        }
    }
    else {
        if (r == null) {
            rr = l + right;
        }
        else {
            rr = l + r;
        }
    }

    if (isInt) {
        return Convert.ToInt32(rr);
    }

    return rr;
}
4

2 に答える 2

8

.NET 4.0 は使用できますか? その場合、動的型付けを使用すると非常に簡単になります。

private object Combine(dynamic o, dynamic o1)
{
    // Assumes an appropriate addition operator, found at execution time
    return o + o1;
}

もう 1 つの方法は、可能な型のペアごとにデリゲートのマップを用意することです。残念なことに、.NET 4.0 より前には型が存在しないため、独自の型をマップ キーとしてTuple定義する必要があります。TypePairもちろん、考えられるすべてのペアを確実にカバーする必要があります...しかし、適切な「AddDelegate」メソッドがあれば、少なくともコンパイラが役立ちます。

private void AddDelegate<T1, T2>(Func<T1, T2, object> sumFunction)
{
    // Put the function in the map
    ...
}

AddDelegate<int,int>((x, y) => x + y);
AddDelegate<int,float>((x, y) => x + y);
AddDelegate<int,string>((x, y) => x + y);
AddDelegate<float,int>((x, y) => x + y);
AddDelegate<float,float>((x, y) => x + y);
AddDelegate<float,string>((x, y) => x + y);
...

ところで、 aと a のbool間の「加算」(たとえば) は意味をなさないので、それを取り出しました。ただし、それらをどのように組み合わせたいかを決めることができます。boolfloat

Mitch が言うように、私はあなたの設計上の決定を再検討します -本当にこれが必要ですか? これはかなり奇妙な要件です。全体像について何か教えていただけますか?代替アプローチを提案できる場合があります。

于 2010-03-22T07:15:18.907 に答える
5

使用したいさまざまなタイプでメソッドをオーバーロードすることができます。タイプセーフでシンプルです。

    private string Combine(string o1, string o2) { return o1 + o2; }
    private string Combine(string o1, int o2) { return o1 + o2; }
    private string Combine(string o1, float o2) { return o1 + o2; }
    private string Combine(float o1, string o2) { return o1 + o2; }
    private float Combine(float o1, int o2) { return o1 + o2; }
    private float Combine(float o1, float o2) { return o1 + o2; }
    private string Combine(int o1, string o2) { return o1 + o2; }
    private float Combine(int o1, float o2) { return o1 + o2; }
    private int Combine(int o1, int o2) { return o1 + o2; }
于 2010-03-23T03:33:44.080 に答える