在输入类的所有方法之前执行常见操作

时间:2014-02-13 02:32:04

标签: c# .net

我想在进入方法之前和离开方法之后立即执行常规操作。这个类很庞大,我不想在整个地方重复代码。有没有我可以使用的模式或特定的结构可以帮助我在这里。

5 个答案:

答案 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 patterninterception