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

2024-01-06

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

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 方法创建一个基类,并让所有这些方法调用它。但我的问题是有very许多方法,并且对 PerformSetup() 的调用需要存在于所有方法中,但尚未存在于任何方法中。

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

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


两个可能的答案:

  1. Use 后锐利 http://www.postsharp.net/aspects/method-decorator。虽然要花钱,但我想它确实有效。
  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
    }
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在任何其他方法调用之前自动调用方法 的相关文章

随机推荐

  • 按名称访问图像资源并将其分配给 PictureBox

    我有这个清单 List
  • 通过对行进行分组来转换数据框

    d1 lt data frame Gender c M M M M F F F F Age c 15 38 17 35 26 24 20 26 如果可能的话 我想把它改成这样 Gender Age M 15 38 17 35 F 26 24
  • 找不到 com/razorpay/Y_$B$$5 的外部类 com/razorpay/Y_$B$

    我正在实施RazorPay安卓结帐 我跟着Razorpay Android sdk 文档 https docs razorpay com v1 page android运行应用程序 gradle 时 构建失败并出现此错误 我也在 Razor
  • 如何确认 href 标签中链接的导航? [复制]

    这个问题在这里已经有答案了 我在管理面板中使用简单的链接 但如果用户意外单击链接进行用户删除 应该会弹出一个确认窗口来避免这种情况 正如您所知 href 标签可能与 javascript 不完全兼容 所以 我使用了 onclick 的spa
  • 如何缓存 Spark 数据框并在另一个脚本中引用它

    是否可以缓存数据帧 然后在另一个脚本中引用 查询 它 我的目标如下 在脚本 1 中 创建一个数据框 df 运行脚本1并缓存df 脚本2中 查询df中的数据 无法使用标准 Spark 二进制文件 火花DataFrame与具体的SQLConte
  • 获取 python 函数中使用/调用的函数列表

    是否有任何工具 库可以列出在另一个方法 函数中调用的方法 函数的列表 例如 如果该工具或库针对以下方法运行 def calculate a int b int operator Operator if operator Operator a
  • C++中的using和include有什么区别?

    我知道 include 用于类 using 用于一些内置的东西 比如命名空间 std 当你包含某些东西时 你可以创建对象并使用它们 但是当你 使用 某些东西时 你可以使用某种内置函数 但是我应该如何创建我自己可以 使用 的 库 呢 简单的说
  • Heroku Symfony 3.2 推送被拒绝,无法编译 PHP 应用程序

    我在 Heroku 上部署 symfony Web 应用程序时遇到了麻烦 而以前它工作得很好 可能出什么问题了 这是构建日志 http pastebin com DXZH110S http pastebin com DXZH110S 这是日
  • WCF服务向客户端发送数据

    是否可以在没有请求的情况下将数据从 WCF 服务发送到客户端 例如 在 WCF 中 我有循环发送数据的函数 我怎样才能实现该功能 这可以通过以下方式实现全复式合同 https msdn microsoft com en us library
  • codecov.io 与 Bitbucket 管道结合时出现错误

    我确实在 Bitbucket 上设置了一个私人存储库来托管 PHP 项目 对于这个项目 我还使用了管道集成 这是我的管道 yaml 文件的内容 image php 7 1 4 pipelines default step script in
  • python 与 c/fortran 的比较

    我编写了以下程序来比较 python 与 c fortran 的速度 为了获取程序使用的时间 我使用了 time 命令 一切 程序计算 x 的平方根x yy z z 其中 x y z 是浮点数 我使用了平方根 因为它是最耗时的部分之一 科学
  • C++:a 的 b 次幂模 k [重复]

    这个问题在这里已经有答案了 a b 模 k问题 编写一个程序来计算模 k 的 b 次幂 例如 如果要求您计算 2 6 mod 7 2 的 6 次方是 64 因此 64 模 7 是 1 输入规格您将得到 3 个整数 a b 和 k 其中 b
  • heroku db:push 显示无效的数据库 url

    我正在尝试使用以下方法将数据推送到 heroku 应用程序 heroku db push 但它吐出了这个错误 root ubuntu lappy rails soft heroku db push Invalid database url
  • MongoDB。 BadValue:使用副本集启用授权时需要 security.keyFile

    我正在尝试配置副本集Mongo in a Docker容器 我已将副本集添加到mongod conf file replication replSetName rs0 但在启动过程中我遇到了下一个异常 BadValue security k
  • 使用 ADO.NET 管理数据库连接

    我们有一个基于 ADO NET 构建的应用程序 我们遵循一些简单的最佳实践 使我们能够利用连接池 例如 使用数据库的代码块可能如下所示 using DbConnection dbConnection GetDatabaseConnectio
  • scrollOverflow 在 fullPage.js 中不起作用

    我最近开始在一个项目中使用 fullPage js 但我不知道如何让溢出滚动起作用 我的页面中的最后一个 部分 很长 因此需要垂直滚动 这是我里面的代码 tags
  • 在 JAR 中指定 JVM 堆大小

    我正在尝试编写一个游戏引擎 但它需要比默认设置更多的内存 我知道如果您双击一个 jar 则会使用默认设置 那么我是否可以指定 JAR 在其清单文件 或其他地方 中需要自定义堆大小 此外 引擎位于它自己的 jar 中 游戏位于另一个 jar
  • 在 Python 包中包含 *.pyd 文件

    我有一个 python 模块模块 pyd一旦手动将其放入 python 安装文件夹的站点包中 它就可以正常工作 当我将解决方案上传到云环境时 问题就开始了 构建包要求我将每个模块作为要安装的包传递pip install module 我创建
  • 如何覆盖Resources.Designer.cs中默认的System.Resources.ResourceManager?

    我想覆盖System Resources ResourceManager from Resources Designer cs文件来实现自定义 ResourceManager GetString 方法功能 这可能吗 我创建了一个Custom
  • 在任何其他方法调用之前自动调用方法

    我有大量的类继承大量的接口 这些类正在实现的接口不共享任何公共方法 但它们都共享一个公共的第一步 一个例子是 A类看起来像这样 class A InterfaceA GetFoo Database db PerformSetup db Th