从委托中读取返回值

时间:2012-04-16 12:22:21

标签: c# delegates

我不确定我是否正确理解了委托的用法,但我想在发布者类中阅读委托返回值。下面的示例如下所示。

//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 
        }

5 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:0)

应该如此简单:

// 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;

答案 2 :(得分:0)

这是一个不使用static用于ValidateAbuse且使用内置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,因为这会给你一个全局状态,以后可能会给你耦合问题,也会让你很难进行单元测试。

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

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

答案 3 :(得分:0)

试试这个:从这里了解更多信息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;
    }

答案 4 :(得分:0)

@TorbjörnKalin的答案很好,但只有你只有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 (虽然这部分是因为我已经知道该怎么做了,而且我没有开始免费试用以阅读其余部分)

希望这有帮助!