传递bool Foo(params [])作为方法参数

时间:2012-05-24 07:22:12

标签: c# .net-3.5 invoke

有些方法需要多次运行才能验证。在我的情况下,有bar.Name.Equals("John Doe")之类的表达式,我想运行并运行,直到此表达式验证。

类似的东西:

bool succeeded = TryUntillOk(bar.Name.Equals("John Doe"), 15, 100);

其中TryUntillOk是一个运行此表达式15次的方法,每次调用之间的睡眠时间为100毫秒。

我阅读了excellent类似问题的答案列表,但在我的情况下,没有标准代表可以接受此TryUntillOk方法。

问题的标题不具有建设性。随意编辑它:)

3 个答案:

答案 0 :(得分:8)

你可能正在寻找这样的东西:

bool TryRepeatedly(Func<bool> condition, int maxRepeats, TimeSpan repeatInterval)
{
    for (var i = 0; i < maxRepeats; ++i)
    {
        if (condition()) return true;
        Thread.Sleep(repeatInterval); // or your choice of waiting mechanism
    }
    return false;
}

将按以下方式调用:

bool succeeded = TryRepeatedly(() => bar.Name.Equals("John Doe"),
                               15,
                               TimeSpan.FromMilliseconds(100));

这里唯一有趣的部分是你将条件指定为Func<bool>,它是一个不带参数并返回布尔值的方法的委托。 Lambda表达式语法允许您在调用站点上轻松构造此类委托。

答案 1 :(得分:1)

您必须调整调用。 @ Jon的答案有lambda调用,这个版本将comparand与委托

分开
using System;
using System.Threading;

namespace test
{
    class something
    {
        public String Name;
    }

    class Program
    {
        private delegate bool TryableFunction(String s);

        private static bool TryUntillOk(TryableFunction f, String s, int howoften, int sleepms)
        {
            while (howoften-->0)
            {
                if (f(s)) return true;
                Thread.Sleep(sleepms);
            }
            return false;
        }

        static void Main(string[] args)
        {
            something bar=new something();

            bar.Name="Jane Doe";
            bool succeeded = TryUntillOk(bar.Name.Equals,"John Doe", 15, 100);
            Console.WriteLine("Succeeded with '{0}': {1}",bar.Name,succeeded);

            bar.Name="John Doe";
            succeeded = TryUntillOk(bar.Name.Equals,"John Doe", 15, 100);
            Console.WriteLine("Succeeded with '{0}': {1}",bar.Name,succeeded);
        }


    }
}

答案 2 :(得分:0)

你可以检查一下

delegate void d_name(string s);

d_name obj =new d_name(bar.Name.Equals);

bool succeeded = TryUntillOk(obj("John Doe"), 15, 100);

TryUntillOk(obj d,type parameter2,type parameter3 )
{
  //do your work
}