【问题标题】:Pass Function with different signitures to another function c#将具有不同签名的函数传递给另一个函数c#
【发布时间】:2016-10-27 18:41:01
【问题描述】:

您好,我想创建一个接受 Function T 并调用它的通用函数。

例如: 魔法函数应该是这样的

 public void Test() 
 {
    InvokeFunction(Test1, "st", "sn");
    InvokeFunction(Test2, 7);
 }

public void InvokeFunction(Function f)
{ 
  f();
}

 public void Test1(string sT, string sFN)
 {
   Console.WriteLine(sT + " : " + sFN);
 }

 public string Test2(int p)
 {
    return p + "";
 }

有办法吗?如果有怎么办?

谢谢!

【问题讨论】:

标签: c# function parameters


【解决方案1】:

您可以使用 Action 来执行此操作,但您必须传递一个 lambda,该 lambda 使用所需的参数调用该方法。

public void Test() 
{
   InvokeFunction(() => Test1("st", "sn"));
}

public void InvokeFunction(Action f)
{ 
    f();
}

public void Test1(string sT, string sFN)
{
    Console.WriteLine(sT + " : " + sFN);
}

但是,如果您的方法具有您想要的返回值,则需要使用 Func 的单独通用方法。

public void Test() 
{
    var result = InvokeFunction(() => Test2(7));
    Console.WriteLine(result);
}

public T InvokeFunction<T>(Func<T> f)
{ 
    return f();
}

public string Test2(int p)
{
    return p + "";
}

【讨论】:

  • 谢谢!如果我既有 void 又有返回值?它仍然可能吗?如果我有一个写入和读取操作,其中写入无效并且读取返回一个值
  • @dan 当然可以,但是您需要同时拥有两个重载,或者最好给它们单独命名,例如 InvokeFunctionInvokeAction
  • 非常感谢!
【解决方案2】:

你的方法可以有一个返回值或 void。所以,你必须有两个泛型函数。

TValue InvokeFunction<TValue>(Func<TValue> func)
{
    return func();
}

void InvokeFunction(Action func)
{
    func();
}

用法,

var result = InvokeFunction(() => Test2(3));
InvokeFunction(() => Test1("p1", "p2"));

【讨论】:

    猜你喜欢
    • 2014-12-12
    • 2020-01-13
    • 1970-01-01
    • 2022-01-10
    • 2020-09-13
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    相关资源
    最近更新 更多