希望有可能: 我有一个这样的代表:
delegate bool X();
我有例如10个方法符合这个签名,但一个需要2个paramaetrs。我怎么能为这一个使用相同的代表?我不太了解lambda表达式,但认为它是可能的。
答案 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
首先,我在此示例中声明了两个代理人ParameterlessToBool
和TwoParameterToBool
。它们分别等同于框架代理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");
}