c# 覆盖引用库中的方法

问题描述

我正在编写一个应用程序来检查数据库中的一些数据(数据库不断更新)。 为了从数据库获取数据,我使用了另一个团队编写的 assembley(.dll 文件)(我无法获取/更改 .dll 文件代码)。

我想用我自己的数据(极端数据)“压力测试”我的算法/porgram,我无法更改数据库一个简化的代码示例:

    public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    //timer1.Interval = 10000
    private void timer1_Tick(object sender,EventArgs e)
    {
        DataTable values = someLib.GetData(DateTime.Now.AddDays(-1),DateTime.Now);
        CheckData(values); //checking the data form the DB,I want to "stress test" this function/logic.

    }
}

我想要 someLib.GetData 函数返回一个特定的数据(检查我的程序)。 我可以编写一个函数,它返回与 someLib.GetData 相同的 DataTable(相同的列等),但使用我自己的数据,问题是该解决方案需要手动检查 GetData 的所有出现(以及从DB)并手动更改它们。 我正在寻找一些系统的方法解决这个问题。 我想到的另一种方法删除引用并“修复”所有错误,问题是我在上述库中使用了很多我仍然需要的函数

我的问题是,有没有办法从我没有代码的程序集中覆盖/禁用一个函数(甚至整个类)?

谢谢。

编辑:方法不是虚拟的。

解决方法

这个解决方案怎么样(如果我理解正确的话):


;* AR0   assigned to _x
;* AR1   assigned to _r
;* T0   assigned to _nx
        PSH     T3
     || BSET    FRCT            ;fractional mode
    SUB #1,T0          ;nx-1
    MOV T0,BRC0        ;repeat nx times
        MOV     #2596 << #16,AC3       ; AC3.Hi = C5
        MOV #-9464 << #16,AC1  ; AC1.Hi = C3
    MOV #32617 << #16,AC2  ; AC2.Hi = C1
*
* Note: loading T3 on the instruction before a multiply that uses it will
* cause a 1-cycle delay.
*
    MPYMR   T3=*AR0+,AC3,AC0      ; (Prime the Pump)
    
     || RPTBLOCAL   loop1-1
            MACR    AC0,T3,AC1,AC0
            MPYR    T3,AC0
          ||MOV *AR0+,T1               ; (for next iteration)
            MACR    AC0,AC2,AC0
              ||MOV T1,T3
            MOV HI(AC0),*AR1+      ;save result
          ||MPYR    T1,AC0            ; (for next iteration)
loop1:

        POP     T3
     || BCLR    FRCT            ;return to standard C
    MOV #0,T0          ;return OK value (no possible error)
     || RET

您需要的只是将 SomeLib 实例的声明更改为 MyLib 实例,即代替

public class MyLib {
  public SomeLib someLib { get; set; }

  public MyLib (SomeLib someLib) {
    this.someLib = someLib;
  }

  public void methodFromSomeLibWhichIsRequired(...) {
    return someLib.methodFromSomeLibWhichIsRequired(...);
  }

  // ... so on for any used methods of SomeLib

  public DataTable getData() {
    // my own implementation of method of SomeLib
  }
}

使用这个

SomeLib someLib = new SomeLib();

因此您无需在任何地方更改 MyLib someLib = new MyLib(new SomeLib()); 的名称,只需在 someLib 中实现您需要的 MyLib 方法。