C# 自动为参数选择最相关的方法
C# Automatically pick most related method for arguments
我在 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 定义为它们的特定类型,因为在我的代码上下文中,我不知道它们的类型是什么。
我尝试实现它的方式是否完全错误,或者是否有一种相当简单的方法来自动选择正确的方法?
如果你真的想在运行时select该方法,你可以使用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));
(我倒置了circle
和rect
)。你想要相同的结果还是不同的?在这两种情况下,您也必须处理这种情况!
其他问题:你要处理的案件数量呈指数级增长。 2个数字,你有4个案例(rect + rect, circle + circle, rect + circle, circle + rect),但是4个数字你已经有16个案例,6个数字36个案例...
您需要使用 dynamic 关键字在您的代码中触发动态调度(运行时评估):
static void Main(string[] args)
{
Object rect = new Rectangle();
Object circle = new Circle();
Console.WriteLine(count((dynamic) rect, (dynamic) circle));
}
在您的示例中,这将打印 0 而不是 4。
我在 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 定义为它们的特定类型,因为在我的代码上下文中,我不知道它们的类型是什么。
我尝试实现它的方式是否完全错误,或者是否有一种相当简单的方法来自动选择正确的方法?
如果你真的想在运行时select该方法,你可以使用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));
(我倒置了circle
和rect
)。你想要相同的结果还是不同的?在这两种情况下,您也必须处理这种情况!
其他问题:你要处理的案件数量呈指数级增长。 2个数字,你有4个案例(rect + rect, circle + circle, rect + circle, circle + rect),但是4个数字你已经有16个案例,6个数字36个案例...
您需要使用 dynamic 关键字在您的代码中触发动态调度(运行时评估):
static void Main(string[] args)
{
Object rect = new Rectangle();
Object circle = new Circle();
Console.WriteLine(count((dynamic) rect, (dynamic) circle));
}
在您的示例中,这将打印 0 而不是 4。