8

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

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

5 回答 5

6
public void Ip(string ip)
{
  if (Callback != null)
  {
    List<String> valueReturnedByCallback = Callback();
  }
}
于 2012-04-16T12:27:19.060 回答
1

这是一个不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,因为这会给你一个全局状态,这可能会给你带来耦合问题,也让你很难进行单元测试。

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

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

于 2012-04-16T14:32:49.580 回答
0

它应该很简单:

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

但是,您可以避免使用 a 一起创建委托Func

public static Func<List<string>> Callback;
于 2012-04-16T12:28:11.400 回答
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;
    }
于 2014-11-19T10:09:40.907 回答
0

@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(尽管部分原因是我已经知道该怎么做,但我没有不要开始免费试用以阅读其余内容)

希望这可以帮助!

于 2018-01-17T04:15:47.683 回答