2011-02-07 38 views
1

希望它是可能的: 我有一个这样的委托:适应非参数委托2个PARAMS使用lambda表达式

delegate bool X(); 

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

+0

你的意思是说,当你调用`X()`时,你想让它运行`Y(g,k)`? – 2011-02-07 08:45:23

+0

我不明白你的问题。你想让你的委托接受一个需要2个参数的方法吗?或者你希望你的无参数委托作为接受带有2个参数的方法的参数? – 2011-02-07 08:45:49

回答

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来初始化TwoParameterToBool类型的objectsEqual变量。它在两个参数上调用Equals()并返回结果。然后我初始化了需要能够调用这个新函数的两个参数。然后使用一个零参数λ来初始化类型的变量ParameterlessToBool。它使用前面定义的两个参数调用双参数函数并返回结果。然后调用函数来显示它是如何使用的。

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"); 
    } 
相关问题