4

我有两个可以表示为 int、float、bool 或 string 的对象。我需要对这两个对象进行加法运算,结果与 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;
}

另一种选择是为每对可能的类型设置一个委托映射。不幸的是,在 .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

正如米奇所说,我会重新审视你的设计决策——你确定你真的需要这个吗?这是一个很奇怪的要求。你能告诉我们关于大局的任何事情吗?我们或许可以提出替代方法。

于 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 回答