我想在进入方法之前和离开方法之后立即执行常规操作。这个类很庞大,我不想在整个地方重复代码。有没有我可以使用的模式或特定的结构可以帮助我在这里。
答案 0 :(得分:1)
你不应该有大班。我建议重构并将每个方法表示为Command对象。
您还可以使用方面以所需方式执行任务。看看像PostSharp这样的框架。
答案 1 :(得分:1)
这是AOP(面向方面编程)的经典案例。 AOP用于执行跨越方法/类/包的操作。有关详细信息,请参阅Aspect Oriented Programming。
答案 2 :(得分: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());
答案 3 :(得分:0)
是的,看看面向方面的编程,例如:
基本上,使用像PostSharp这样的AOP框架会在你提到的开头和结尾注入代码,这可以是动态的或静态的,所有这些都是通过应用这样的属性来实现的:
[ExceptionHandler]
public void CreateError() {
.
.
}
ExceptionHandler是您创建的自定义属性。一些框架拦截方法调用并运行一些代码like SimpleInjector。
答案 4 :(得分:0)
这是一个非常广泛的问题,即使现在似乎不适合你。需要注意的一些事项包括aspect oriented programming decorator pattern和interception。