使用lambda表达式将非参数委托调整为2个参数

时间:2011-02-07 08:39:14

标签: c# lambda

希望有可能: 我有一个这样的代表:

delegate bool X();

我有例如10个方法符合这个签名,但一个需要2个paramaetrs。我怎么能为这一个使用相同的代表?我不太了解lambda表达式,但认为它是可能的。

2 个答案:

答案 0 :(得分:1)

当然可以,您只需要为要使用的函数提供参数。你不能只调用一个不需要任何参数的函数。

delegate bool ParameterlessToBool();                  // AKA: Func<bool>
delegate bool TwoParameterToBool(object a, object b); // AKA: Func<object, object, bool>

TwoParameterToBool objectsEqual = (a, b) => a.Equals(b);
object argument1 = 1;
object argument2 = 2;
ParameterlessToBool isEqual = () => objectsEqual(argument1, argument2);
bool result = isEqual(); // false

首先,我在此示例中声明了两个代理人ParameterlessToBoolTwoParameterToBool。它们分别等同于框架代理Func<bool>Func<object, object, bool>。你不需要这样做,我只是在示例中有一些工作。

我使用双参数lambda来初始化objectsEqual类型的TwoParameterToBool变量。它在两个参数上调用Equals()并返回结果。然后我初始化了能够调用这个新函数所需的两个参数。然后使用零参数lambda初始化isEqual类型的ParameterlessToBool变量。它使用前面定义的两个参数调用双参数函数并返回结果。然后调用函数来显示它是如何使用的。

答案 1 :(得分:0)

为什么不简单地使用oob代表?

  • Action<T>
  • Funct<Tresult>
  • Funct<Tin, Tresult>
  • Funct<Tin1, Tin2, Tresult>
  • ...

例如,以下代码可能会回答您的问题(如果我理解正确的话):

    public void MethodWithNoArgNoReturn()
    {

    }

    public int MethodWithNoArgWithReturn()
    {
        return 42;
    }

    public void MethodWith1ArgNoReturn(int i)
    { }

    public int MethodWith2ArgsWithReturn(string s1, string s2)
    {
        return 42;
    }

    void test()
    {
        var a1 = new Action(MethodWithNoArgNoReturn);
        a1();

        var f1 = new Func<int>(MethodWithNoArgWithReturn);
        var i1 = f1();

        var a2 = new Action<int>(MethodWith1ArgNoReturn);
        a2(43);

        var f2 = new Func<string, string, int>(MethodWith2ArgsWithReturn);
        var i2 = f2("test", "test");
    }
相关问题