我想在进入方法之前和离开方法之后执行常规操作。这个类很庞大,我不想在整个地方重复代码。是否有任何我可以使用的模式或特定的构造可以帮助我。在输入方法的所有方法之前执行常规操作
0
A
回答
1
你不应该有巨大的类。我会建议重构并将每个方法表示为Command对象。
您还可以使用方面以所需的方式执行任务。看看PostSharp这样的框架。
0
是的,看着面向方面的编程,例如:
- http://msdn.microsoft.com/en-us/library/aa288717(v=vs.71).aspx
- http://www.codeproject.com/Articles/337564/Aspect-Oriented-Programming-Using-Csharp-and- 帖子
- http://visualstudiomagazine.com/articles/2012/09/01/aop-with-postsharp.aspx
从本质上讲,使用AOP框架一样PostSharp在开始注入代码并按照您提到的结束,并且这可以是动态的或静态的,全部通过应用像这样的属性:
[ExceptionHandler]
public void CreateError() {
.
.
}
其中ExceptionHandler是您创建的自定义属性。一些框架拦截方法调用并运行一些代码,like SimpleInjector。
1
这是AOP(面向方面编程)的经典案例。 AOP用于执行切入方法/类/包的操作。有关更多信息,请参阅Aspect Oriented Programming。
0
这是一个相当广泛的问题,即使它现在看起来不适合你。有些东西要看是aspect oriented programmingdecorator pattern和interception。
1
先前的答案为您提供了很好的建议和实践,但如果您无法完成重构,并且您可以使用反射,那么可以执行以下操作。
创建一个包装你的HugeClass
,其中包括两个方法与你需要和之前做后的方法调用共同操作的包装类,以及暴露一个方法调用任何的包装类方法一起与常见的操作:
public static class HugeClassWrapper
{
private static HugeClass hugeClass = new HugeClass();
public static void Invoke(Expression<Action<HugeClass>> expression)
{
CommonOperationBefore();
expression.Compile().Invoke(hugeClass);
CommonOperationAfter();
}
public static TResult Invoke<TResult>(Expression<Func<HugeClass, TResult>> expression)
{
CommonOperationBefore();
TResult result = (TResult)expression.Compile().Invoke(hugeClass);
CommonOperationAfter();
return result;
}
private static void CommonOperationBefore()
{
// your common operations...
}
private static void CommonOperationAfter()
{
// your common operations...
}
}
我已经包括了Invoke
方法的两个重载,原因是能够以调用返回的任何值void的方法或方法。
因此,举例来说,如果你的类是:
public class HugeClass
{
public string Method1(int a, double b)
{
return (a * b).ToString();
}
// ...
public void Method1000()
{
}
}
为了调用该方法,你可以这样做:
string result = HugeClassWrapper.Invoke<string>(x => x.Method1(2, 3.14));
或
HugeClassWrapper.Invoke(x => x.Method1000());
相关问题
- 1. REST方法 - 在执行其他方法之前执行“常用”方法调用
- 2. @parameters方法在@beforeclass方法执行之前执行
- 3. 有什么方法可以对流输入执行操作吗?
- 4. MVC输入操作方法
- 5. 如何创建所有CRUD操作将在笨执行方法
- 6. 如何在执行操作前检查所有方法是否正确
- 7. 有没有办法在IResultListener方法之前运行@after方法?
- 8. 在执行操作之前,Spark必须读取所有输入文件吗?
- 9. 页面提交后GET方法在POST方法之前执行?
- 10. 我可以在所有测试之前/之后执行操作
- 11. SQL中的“AND”操作执行方法
- 12. 执行此操作的好方法?
- 13. 在MVVM绑定之前覆盖以执行操作的事件/方法
- 14. 如何在commandLink下载文件之前执行commandLink的操作方法?
- 15. 执行方法之前业务逻辑
- 16. 如何在执行一些其他有重载的方法之前/之后每次执行一个方法?
- 17. 在执行get方法之前执行的JavaScript for循环
- 18. 常规SQL行()方法
- 19. evaulate方法执行之前和试验方法一起
- 20. 在Visual Studio中的所有WebTest之前执行操作
- 21. seam操作方法执行两次?
- 22. 操作方法不执行任何
- 23. commandButton操作方法未执行
- 24. JSF在调用操作方法之前没有更新值
- 25. 在虚拟方法的所有覆盖之后执行代码
- 26. 在执行方法之前使用注释执行代码
- 27. 无法在Process.Runtime.exec语句行之前执行任何操作
- 28. LinkedList插入之前方法
- 29. 执行片段之前的方法将片段放入backstack
- 30. MVC获取所有操作方法
“*的类是巨大的*“你可能想要重构它。如果你有太多的方法,在每个方法的顶部添加一个方法调用来执行这个常用操作太麻烦了,那么该类可能需要分解。 –