C# 从委托读取返回值

C# 从委托读取返回值,c#,delegates,C#,Delegates,我不确定是否正确理解了委托的用法,但我想阅读publisher类中的委托返回值。下面是示例和说明 //Publisher class public class ValidateAbuse { public delegate List<String> GetAbuseList(); public static GetAbuseList Callback; public void Ip(string ip) { // I w

我不确定是否正确理解了委托的用法,但我想阅读publisher类中的委托返回值。下面是示例和说明

//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 
        }
//发布者类
公共类可验证性使用
{
公共委托列表GetAbuseList();
公共静态GetAbuseList回调;
公共无效Ip(字符串Ip)
{
//我想在这里阅读GetAbuseList值(列表)。怎么做?
}
}
//订户类别
类服务器
{
公共静态void Start()
{
validateBuse.Callback=GetIpAbuseList;
validateBuse.Ip(MyIp);
}
私有静态列表GetIpAbuseList()
{
//将列表返回到ValidateBuse类,并在公共void Ip(字符串Ip)方法中使用返回值
}
公共无效Ip(字符串Ip)
{
if(回调!=null)
{
列表值ReturnedByCallback=Callback();
}
}

它应该简单到:

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

这是一个不使用
static
进行ValidateBuse的版本,它使用内置的
Func
委托

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 
    }
}
公共类可验证性使用
{
私有函数回调;
公共ValidateBuse(Func回调)
{
this.callback=回调;
}
公共无效Ip(字符串Ip)
{
var result=callback();
}
}
公共类服务器
{
公共静态void Start()
{
var validateAbuse=新的validateAbuse(GetIpAbuseList);
validateBuse.Ip(MyIp);
}
私有静态列表GetIpAbuseList()
{
//将列表返回到ValidateBuse类,并在公共void Ip(字符串Ip)方法中使用返回值
}
}
我建议您避免使用
static
,因为这会给您带来全局状态,这可能会在以后给您带来耦合问题,也会使您很难进行单元测试

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


我还将尝试使服务器非静态。

尝试以下操作:从这里阅读更多内容


@Torbjörn Kalin的答案是好的,但前提是您只有一个要从中获取返回值的代理。如果您要检索多个代理的返回值,请按照以下方式执行:

//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>();
}
//发布者类
公共类可验证性使用
{        
公共委托列表GetAbuseList();
公共静态GetAbuseList回调;
公共无效Ip(字符串Ip)
{        
foreach(Callback.GetInvocationList()中的GetAbuseList gal)
{                
List result=gal.Invoke(/*参数的任何参数都在此处*/);
//在这里对结果进行任何处理
}
}            
}
//订户类别
类服务器
{
公共静态void Start()
{
//使用+=添加到代理列表中
validateBuse.Callback+=GetIpAbuseList;
validateBuse.Ip(MyIp);
}
私有静态列表GetIpAbuseList()
{
//返回码在这里
返回新列表();
}
这将一个接一个地调用每个委托,您可以分别处理每个委托的输出

这里的关键是使用
+=
操作符(而不是
=
操作符),并通过调用
GetInvocationList()
然后对检索到的每个代理调用
Invoke()
来循环检索列表

我读了这一页后发现: (虽然部分原因是因为我已经知道该做什么,并且我没有开始免费阅读其余部分)


希望这有帮助!

我建议您在创建ValidateBuse实例时不要使用static,而是将回调作为参数传递。此外,您还可以使用内置委托
Func@TorbjörnKalin你能发布一个例子吗?我是c#新手,这个例子对我来说会更清楚。你正在调用
validateBuse.Ip
statically(没有实例),但是
Ip
方法实际上没有定义
static
@Tomas太多了,无法在注释中写入,所以我发布了一个答案。
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 
    }
}
internal delegate int PowerOfTwo();
void Main(){
    PowerOfTwo ch = new PowerOfTwo(CheckPower);
    Console.WriteLine(ch());
    }
int CheckPower(){
    return 2*2;
    }
//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>();
}