我有一个可以是VideoRequest
或Request
类型的对象。这两个类都继承自public static DoThings
{
public static void HandleRequest(AudioRequest r)
{
// Do things.
}
public static void HandleRequest(VideoRequest r)
{
// Do things.
}
}
。我有这门课:
DoThings.HandleRequest(r)
我希望能够致电r
,其中VideoRequest
可以是AudioRequest
或*Request
,并让它调用正确的DoThings
。那可能吗?我无法控制HandleRequest
类,因此我无法对它们做任何事情。我确实控制了public Response Post(Request input)
{
return DoThings.HandleRequest(input);
}
类和调用Argument 1: cannot convert from 'Request' to 'AudioRequest'
的代码。这是调用它的代码,它是WebAPI:
if (input.GetType() == typeof(AudioRequest))
{
var audioRequest = (AudioRequest)input;
DoThings.HandleRequest(audioRequest);
}
else if (input.GetType() == typeof(VideoRequest))
{
var videoRequest = (VideoRequest)input;
DoThings.HandleRequest(videoRequest);
}
上面的代码给出了错误$step_master = [1, 2, 3, 4, 5, 6, 7, 8, 9];
$step_now = 4;
$step_before = ????;
$step_next = ????;
。
我正在清理的原始代码有:
$step_now
但我认为有一种更清洁的方法可以做到这一点。
答案 0 :(得分:1)
根据您目前提供的信息,您的问题似乎与How to call a function dynamically based on an object type重复。我同意答案,你要这样做的事实表明你应该重新考虑设计。但是,您可以使用dynamic
来完成您想要的任务。
这是一个简单的控制台程序,它演示了基本的想法:
class Program
{
static void Main(string[] args)
{
A b = new B(), c = new C();
M(b);
M(c);
}
static void M(A a)
{
WriteLine("M(A)");
M((dynamic)a);
}
static void M(B b)
{
WriteLine("M(B)");
}
static void M(C c)
{
WriteLine("M(C)");
}
}
class A { }
class B : A { }
class C : A { }
输出结果为:
M(A) M(B) M(A) M(C)
如您所见,在每种情况下,首先调用M(A)
方法,然后从M(B)
调用相应的M(C)
或M(A)
重载。
在您自己的示例中,这看起来像这样:
public static DoThings
{
public static void HandleRequest(Request r)
{
// Dynamic dispatch to actual method:
HandleRequest((dynamic)r);
}
public static void HandleRequest(AudioRequest r)
{
// Do things.
}
public static void HandleRequest(VideoRequest r)
{
// Do things.
}
}
请注意,dynamic
确实会产生运行时成本,尤其是第一次使用给定的运行时类型调用方法时。但是根据这些"请求"的频率和复杂性,使用dynamic
可能是目前情况下最干净的方法。
答案 1 :(得分:0)
C#将调用与参数及其类型匹配的相应函数。 话虽这么说,你的两个函数都接受AudioRequest,我相信其中一个应该接受一个VideoRequest。
public static DoThings
{
public static void HandleRequest(AudioRequest r)
{
// Do things.
}
public static void HandleRequest(VideoRequest r)
{
// Do things.
}
}
答案 2 :(得分:-2)
如果由于某种原因你必须有两个不同的函数只接受AudioRequest,你可以用额外的参数来区分两个函数
public static class DoThings
{
public static void HandleRequest(AudioRequest r)
{
// Do things.
}
public static void HandleRequest(AudioRequest r, bool UseAlternativeMethod)
{
// Do other things.
}
}
只要有第二个参数就会调用第二个方法而不管它的值是什么。
这不是最佳实践解决方案,因为您宁可通过准确地重命名方法名称来区分它们,但实际上您并不总是有选择。