在运行时使用方法扩展 Class

Extending a Class with a method on runtime

是否可以在 运行 时向现有 class 添加方法?

我想创建 ListTestcase 个对象,但我不想为每个 Testcase 个对象创建一个对象。所以我喜欢对没有任何过程信息的测试用例使用没有任何方法的唯一对象。我想在之后添加这个方法。

代码:

public class Testcollection
{
    public List<TestCase> TestcaseList = new List<TestCase>();
    public string title;
    public Testcollection(string Title)
    {
        title = Title;
    }
}
public class TestCase
{
    public string title;
    public TestCase(string Title)
    {
        title = Title;
    }
}
public class initTestcollection
{
    public Testcollection T1 = new Testcollection("Collection1");
    public Testcollection T2 = new Testcollection("Collection2");
    public void AddTestCases()
    {
        T1.TestcaseList.Add(new TestCase("Test1"));
        T1.TestcaseList.Add(new TestCase("Test2"));
    }
    //Pseudocode
    public void inject_method_toT1()
    {
    Console.WriteLine("injected code A");
    }
    public void inject_method_toT2()
    {
    Console.WriteLine("injected code B");
    }
    //constructor
    public initTestcollection()
    {
        AddTestCases();
        inject_method_toT1();
        inject_method_toT2()
    }

}

void Main()
{
 Testcollection MyCollection = new initTestblocks();
 MyCollection.T1.TestcaseList[0].inject_method_toT1();
 MyCollection.T1.TestcaseList[1].inject_method_toT2();
}

最接近的方法是使用 Dynamic Language Runtime features with an ExpandoObject

dynamic d = new ExpandoObject();
d.Quack = (Action)(() => System.Console.WriteLine("Quack!!!"));
d.Quack(); 

虽然这有很多缺点,包括缺少 InteliSense、访问 non-existent 成员时没有编译器错误以及性能不佳,

我找到了以下 post:Dynamically assign method / Method as variable 这样我就可以为我的测试用例 Class 分配一个 "dummy" 方法,并可以在运行时为其分配一个测试工作流。对于具有相同用例的人,代码:

public class TestCase
{
    public string title;
    public TestCase(string Title)
    {
        title = Title;
    }
    public Action dummyMethod{ get; set; }
}
public void realMethod()
{
    System.Console.WriteLine("testSuccesfull");
}
public initTestcollection()
{
    AddTestCases();
    T1.TestcaseList[0].dummyMethod= realMethod;
}