是否可以在不同的上下文中调用具有相同签名的两个函数? (属性操作)

时间:2015-06-19 05:30:26

标签: c#

我遇到了一个有趣的问题,可能是由于我无法控制的第三方API的设计。

请考虑以下示例代码:

class MyClass : ThirdPartyClass {
    void SpecialFunction() {
        //...
    }
}

第三方API在内部处理后调用SpecialFunction

我可以添加一个属性来告诉API在内部处理之前应该调用它:

[DoFirst]
void SpecialFunction() { ... }

但是,这意味着如果我想在API内部处理之前和之后运行相同的函数,我必须有两个额外的类:

class MyClass : ThirdPartyClass {
    public void DoSpecialFunction() { ... }
}

class MyClassPre : ThirdPartyClass {
    MyClass myClass;
    [DoFirst]
    void SpecialFunction() {
        myClass.DoSpecialFunction();
    }
}

class MyClassPost : ThirdPartyClass {
    MyClass myClass;
    void SpecialFunction() {
        myClass.DoSpecialFunction();
    }
}

这显然无效:

class MyClass : ThirdPartyClass {
    [DoFirst]
    void SpecialFunction() { _SpecialFunction(); }

    void SpecialFunction() { _SpecialFunction(); }

    void _SpecialFunction() { ... }
}

是否有一些C#方式我可以操作属性或函数签名,以便不需要其他类?

也许通过某种方式延伸? (SpecialFunction不是覆盖)

1 个答案:

答案 0 :(得分:4)

正如评论中所提到的,你不能有两个具有相同名称和参数的方法,这些方法只有它们的装饰属性不同。

据推测,第三方API使用反射来识别SpecialFunction(),因此您应该能够简化您的解决方法,如下所示:

// An instance of this class will Do After
public class MyClass : ThirdPartyClass 
{
    public virtual void SpecialFunction() 
    { 
       // All the work goes here
    }
}

// An instance of this class will Do First
public class MyClassPre : MyClass 
{
    [DoFirst]
    public override void SpecialFunction() 
    {
        base.SpecialFunction();
    }
}

如果您与之合作的组织或您正在使用服务的组织向您提供第三方API,您可以请求他们添加[DoAfter]属性以触发默认行为好。在这种情况下,你可以简单地装饰如下:

class MyClass : ThirdPartyClass 
{
    [DoFirst]
    [DoAfter]
    void SpecialFunction()
    {
        //  ...
    }
}