C#从现有函数声明委托签名

时间:2017-11-08 21:25:24

标签: c# delegates

当我已经在代码中有函数时,我想避免为委托声明两次函数签名。我觉得我错过了一些明显的东西,但我似乎无法通过谷歌搜索找到这样做。

public class SomeLibraryV1
{
  public int DoSomething(int x, int y);
}

public class SomeLibraryV2
{
  public int DoSomething(int x, int y);
}

public class SomeConsumer
{
  // Create the delegate by manually declaring the signature again :-(
  private delegate int DoSthDelegate(int x, int y);

  public void Run(DoSthDelegate aDelegate)
  {
    aDelegate(1, 2);
  }
}

所以我想做的就是避免int fn(int, int)的第二次声明。像

这样的东西
public class SomeConsumer
{
  // Create the delegate from the function signature we already know :-)
  public delegate DoSthDelegate(SomeLibrary.DoSomething);

  public void Run(DoSthDelegate aDelegate)
  {
    aDelegate(1, 2);
  }
}

这不仅可以节省我每次输入两次声明,而且如果DoSomething的签名发生变化,我将不得不将事情保存在两个地方。

1 个答案:

答案 0 :(得分:0)

你错过了一个关于代表的决定 - 更不用说重要的一点了。您可以使用相同的签名注册任何方法。因此,将您的委托绑定到一个修复方法并不是很有帮助。如果你只是调用相同的方法,那么根本不应该使用委托。只需直接在DoSomething - 方法中调用Run - 方法,而不是调用代理:

Run()
{
    var retVal = DoSomething(3, 5)
}

事实上,代表只不过是一种签名,也可以通过多种方法来满足。此外,这是您可以通过相同的委托定义注册多个事件处理程序的事件的基础。

因此,所有委托都会指示有一个方法需要两个int值并返回一个int。但是,它没有对这个方法的定义做出任何假设 - 它也可能是一个匿名的,例如:

Run((x, y) => x + y);

当然这是一些重复的打字。但是,它确保您不能调用不适合委托签名的方法。因此,您唯一能做的就是使用Func - 委托而不是创建自己的委托:

public TheFunc Func<int, int, int> { get; set; }

您可以通过以下声明进行设置:

Run(instanceOfMyLibrary.DoSomething);

或者:

Func<int, int, int> f = instanceOfyLibrary.DoSomething;
Run(f);

注意:您的代理人必须是public才能将其作为Run - 方法的参数提供。