基于参数类型的调用方法

时间:2017-09-22 05:37:13

标签: c#

我有一个可以是VideoRequestRequest类型的对象。这两个类都继承自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

但我认为有一种更清洁的方法可以做到这一点。

3 个答案:

答案 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.
    }
}

只要有第二个参数就会调用第二个方法而不管它的值是什么。

这不是最佳实践解决方案,因为您宁可通过准确地重命名方法名称来区分它们,但实际上您并不总是有选择。