从委托读取返回值

本文关键字:返回值 读取 | 更新日期: 2023-09-27 18:31:26

我不确定我是否正确理解了委托的用法,但我想在发布者类中读取委托返回值。示例如下,并附有说明。

//Publisher class
    public class ValidateAbuse
    {
    public delegate List<String> GetAbuseList();
    public static GetAbuseList Callback;
    public void Ip(string ip)
    {
    //   I would like to read GetAbuseList value (List<String>) here. How to do that?
    }
    }

//Subscriber class
    class Server
    {
        public static void Start()
        {
            ValidateAbuse.Callback = GetIpAbuseList;
            ValidateAbuse.Ip(MyIp);
        }
        private static List<string> GetIpAbuseList()
        {
            //return List<String> to ValidateAbuse class and use return value in public void Ip(string ip) method 
        }

从委托读取返回值

public void Ip(string ip)
{
  if (Callback != null)
  {
    List<String> valueReturnedByCallback = Callback();
  }
}

这是一个不使用 ValidateAbuse static并使用内置Func<T>委托的版本。

public class ValidateAbuse
{
    private Func<List<string>> callback;
    public ValidateAbuse(Func<List<string>> callback)
    {
        this.callback = callback;
    }
    public void Ip(string ip)
    {
        var result = callback();
    }
}
public class Server
{
    public static void Start()
    {
        var validateAbuse = new ValidateAbuse(GetIpAbuseList);
        validateAbuse.Ip(MyIp);
    }
    private static List<string> GetIpAbuseList()
    {
        //return List<string> to ValidateAbuse class and use return value in public void Ip(string ip) method 
    }
}

我建议你避免static因为这会给你一个全局状态,这在以后可能会给你带来耦合问题,也会让你难以进行单元测试。

到目前为止给出的其他答案有一个保护子句,检查回调是否为空。除非这是预期的行为(回调为空),否则我会避免这种情况。最好尽早崩溃,而不是以后很难调试错误。

我也会尝试使服务器非静态。

它应该像这样简单:

// Ip in your code sample is missing static
public static void Ip(string ip)
{
    List<string> abuseList;
    if (Callback != null)
        abuseList = Callback()
}

但是,您可以使用以下Func避免同时创建委托:

public static Func<List<string>> Callback;

试试这个:从这里阅读更多内容 http://msdn.microsoft.com/en-us/library/bb534960%28v=vs.110%29.aspx

internal delegate int PowerOfTwo();
void Main(){
    PowerOfTwo ch = new PowerOfTwo(CheckPower);
    Console.WriteLine(ch());
    }
int CheckPower(){
    return 2*2;
    }

@Torbjörn Kalin的答案很好,但前提是你只有1个委托,你想从中获取返回值。如果要检索多个委托的返回值,请按以下步骤操作:

//Publisher class
public class ValidateAbuse
{        
    public delegate List<String> GetAbuseList();
    public static GetAbuseList Callback;
    public void Ip(string ip)
    {        
        foreach (GetAbuseList gal in Callback.GetInvocationList())
        {                
            List<string> result = gal.Invoke(/*any arguments to the parameters go here*/);
            //Do any processing on the result here
        }
    }            
}

//Subscriber class
class Server
{
        public static void Start()
        {
            //Use += to add to the delegate list
            ValidateAbuse.Callback += GetIpAbuseList;
            ValidateAbuse.Ip(MyIp);
        }
        private static List<string> GetIpAbuseList()
        {
            //return code goes here
            return new List<String>();
}

这将一个接一个地调用每个委托,并且您可以彼此分开处理每个委托的输出。

这里的关键是使用 += 运算符(而不是 = 运算符)并循环遍历通过调用 GetInvocationList() 然后对检索到的每个委托调用Invoke()来检索的列表。

阅读此页面后我想通了这一点:https://www.safaribooksonline.com/library/view/c-cookbook/0596003390/ch07s02.html(虽然部分原因是我已经知道该怎么做,我没有开始免费试用来阅读其余部分)

希望这有帮助!