2011-02-07 87 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"); 
    } 
相關問題