希望它是可能的: 我有一個這樣的委託:適應非參數委託2個PARAMS使用lambda表達式
delegate bool X();
我有例如10個符合此簽名的方法,但需要2個參數。我怎麼能爲這一個使用相同的代表呢?我不太瞭解lambda表達式,但認爲這是可能的。
希望它是可能的: 我有一個這樣的委託:適應非參數委託2個PARAMS使用lambda表達式
delegate bool X();
我有例如10個符合此簽名的方法,但需要2個參數。我怎麼能爲這一個使用相同的代表呢?我不太瞭解lambda表達式,但認爲這是可能的。
當然你可以,你只需要提供參數給你想要使用的函數。你不能只調用一個沒有任何需要參數的函數。
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
首先,我宣佈兩位代表在本例中使用,ParameterlessToBool
和TwoParameterToBool
。它們分別相當於框架代表Func<bool>
和Func<object, object, bool>
。你不需要這樣做,只是這樣我才能在這個例子中使用。
我使用兩參數lambda來初始化TwoParameterToBool
類型的objectsEqual
變量。它在兩個參數上調用Equals()
並返回結果。然後我初始化了需要能夠調用這個新函數的兩個參數。然後使用一個零參數λ來初始化類型的變量ParameterlessToBool
。它使用前面定義的兩個參數調用雙參數函數並返回結果。然後調用函數來顯示它是如何使用的。
你爲什麼不簡單地使用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");
}
你的意思是說,當你調用`X()`時,你想讓它運行`Y(g,k)`? – 2011-02-07 08:45:23
我不明白你的問題。你想讓你的委託接受一個需要2個參數的方法嗎?或者你希望你的無參數委託作爲接受帶有2個參數的方法的參數? – 2011-02-07 08:45:49