C#自动选择最相关的参数方法

时间:2015-04-20 05:20:47

标签: c# methods overloading

我在C#中有以下代码:

static void Main(string[] args)
{
    Object rect = new Rectangle();
    Object circle = new Circle();
    Console.WriteLine(count(rect, circle));
}

public static int count(Object obj1, Object obj2)
{
    return 4;
}

public static int count(Rectangle rect, Circle circ)
{
   return 0;
}

程序输出4,但是,我希望它选择更具体的方法,这将是第二种方法。我不能简单地将变量rect和circle定义为它们的特定类型,因为在我的代码的上下文中,我不知道它们的类型是什么。

我试图实现这一点的方式是否存在完全错误,或者是否有一种相当简单的方法来自动选择正确的方法?

2 个答案:

答案 0 :(得分:6)

如果您确实想在运行时选择方法,可以使用dynamic。请注意,它是

dynamic rect = new Rectangle();
dynamic circle = new Circle();
Console.WriteLine(count(rect, circle));

我仍然认为你应该使用的模式是不同的,但除非你告诉我们你真正想要的东西,否则很难解释什么是真正的模式。

例如不使用动态,您可以:

public static int count(Object obj1, Object obj2)
{
    if (obj1 is Rectangle && obj2 is Circle)
    {
        return count((Rectangle)obj1, (Circle)obj2);
    }

    return 4;
}

请注意,我仍然觉得这里有问题,因为如果你

会发生什么
Console.WriteLine(count(circle, rect));

(我倒置circlerect)。你想要相同或不同的结果吗?在这两种情况下,你也必须处理这种情况!

其他问题:您必须处理的案件数量呈指数级增长。有2个数字,你有4个案例(矩形+矩形,圆形+圆形,矩形+圆形,圆形+矩形),但有4个数字,你已经有16个案例,6个数字有36个案例......

答案 1 :(得分:4)

您需要使用动态关键字

在代码中触发动态调度(运行时评估)
static void Main(string[] args)
{
    Object rect = new Rectangle();
    Object circle = new Circle();
    Console.WriteLine(count((dynamic) rect, (dynamic) circle));
}

在您的示例中,这将打印0而不是4。