【问题标题】:C# - How to pass and run a method in a function?C# - 如何在函数中传递和运行方法?
【发布时间】:2014-08-08 13:36:22
【问题描述】:

我正在尝试为 Selenium 测试编写一个包装器,如果测试失败,它会重新运行测试,我的机制工作正常。但我需要找出一种在函数内部传递函数/方法或(最好)多个方法的方法。这是我想要实现的示例:

在包装类中:

public class TestRunner{
    public void RunTest(function FuncToRun){
        FuncToRun();        
    }
}

在测试中:

public class Tests{
    public void Test(){
        ...Run test methods...
    }
TestRunner.RunTest(Test());
}

这纯粹是为了演示。我知道这行不通,但我希望它能将我的观点传达给你。

【问题讨论】:

    标签: c# function testing parameters wrapper


    【解决方案1】:

    看起来您需要delegate

    适用于您的场景的委托是 Action 委托,可用于表示单个无参数方法。

    public class TestRunner
    {
        public void RunTests(params Action[] tests)
        {
            foreach (var test in tests)
            {
                test.Invoke();
            }
        }
    }
    

    注意params 关键字的使用,这将允许您为RunTests 方法提供任意数量的测试。下面是一个使用隐式方法组转换的例子:

    public class Tests
    {
        public void TestOne() {
        }
    
        public void TestTwo() {
        }
    }
    
    ...
    var runner = new TestRunner();
    var tests = new Tests();
    runner.RunTests(tests.TestOne, tests.TestTwo);
    

    【讨论】:

      【解决方案2】:

      您可以使用Action 参数来执行此操作

      public class TestRunner{
          public void RunTest(Action FuncToRun){
              FuncToRun();        
          }
      }
      
      public class Tests{
          public void Test(){
              ...Run test methods...
          }
          TestRunner.RunTest(() => Test());
      }   
      

      【讨论】:

        【解决方案3】:

        你想做这样的事情。但需要更多上下文作为输入以及您期望的返回值。

           Func<string, int> myMethodName
        

        这是一个用法示例:

           public bool RunThisMethod(Func<string, int> myMethod)
            {
                //... do stuff
                int i = myMethod("My String");
                //... do more stuff
                return true;
            }
        

        【讨论】:

          【解决方案4】:

          使用委托。只需为您要传递的方法声明一个委托,然后调用并将该方法分配给它。

          http://msdn.microsoft.com/en-IN/library/ms173171.aspx

          【讨论】:

            【解决方案5】:

            您可以使用委托,甚至是 Action 或 Func 对象。

            public class TestRunner{
                public void RunTest(Action funcAction){
                    funcAction();        
                }
            }
            
            public class Tests{
                public void Test(){}
                TestRunner.RunTest(Test);
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-07-21
              • 1970-01-01
              • 2021-07-25
              • 2019-03-20
              • 1970-01-01
              • 1970-01-01
              • 2014-04-26
              相关资源
              最近更新 更多