c# - 在任何其他方法调用之前自动调用方法

标签 c# inheritance n-tier-architecture

我有大量的类继承于大量的接口(interface)。这些类正在实现的接口(interface)不共享任何公共(public)方法,但它们都共享一个公共(public)的第一步。这方面的一个例子是:

A 类看起来像这样:

class A : InterfaceA
{

    GetFoo(Database db)
    {
       PerformSetup(db); // This is the common first step.

       // Do foo things
    }
}

B 类可能看起来像这样:

class B : InterfaceB
{
    GetBar(Database db)
    {
        PerformSetup(db); // This is the common first step.

        // Do bar things
    }
}

现在显然我可以使用 PerformSetup 方法创建一个基类,并让所有这些方法调用它。但我的问题是,有非常的方法,并且对 PerformSetup() 的调用需要在所有这些方法中,但它还没有在任何一个方法中。

所以我当然可以将该设置代码复制粘贴到每个方法的开头,但为了 DRY 和我自己的时间,我想知道是否有某种方法可以确保自动调用该方法在任何(如果可能的话,仅公开)方法调用之前?我可以以某种方式利用事件吗?再次记住,没有类共享公共(public)接口(interface),并且许多接口(interface)方法除了数据库参数之外还有参数,但它们都具有数据库参数。

这可能有点不可思议,但我总是很好奇人们能够用 C# 装配出什么疯狂的装置。

最佳答案

两个可能的答案:

  1. 使用PostSharp 。虽然要花钱,但我想它是有效的。
  2. 您可以在调用方法之前使用反射来调用 PerformSetup 方法

基本上,您可以使用以下内容创建基类

class Base
{
    public void InvokeMethodWithSetup(string method, Database db, params object[] args)
    {
        PerformSetup(db);
        var method = this.GetType().GetMethod(method);
        method.Invoke(this, args);   
    }

    public void PerformSetup(Database db)
    {
        // stuff
    }
}

不幸的是,这意味着要调用您的方法之一来替换调用代码,所以我不知道这是否会让事情变得更容易,但至少它使您不必修改所有方法。

关于c# - 在任何其他方法调用之前自动调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18134404/

相关文章:

java - 利用继承来打印引用

wcf - 我怎么知道我应该使用 self 跟踪实体还是 DTO/POCO?

n-tier-architecture - N层架构设计关注点分离

c# - 如何在 C# 中实现绘图器

c#有没有办法让我的基类和派生类分别实现接口(interface)方法?

c# - 将值传递给匿名函数

swift:如何将父类(super class)中的公共(public)方法覆盖为子类中的私有(private)方法

c# - 数据模型和服务模型之间的继承模式是什么?

c# - 在 LINQ C# 中加入和排序

c# - 使用 .NET Core 2 的 Azure WebJobs 失败并显示 "Invalid storage account"