我遇到了一个有趣的问题,可能是由于我无法控制的第三方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
不是覆盖)
答案 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()
{
// ...
}
}