从委托读取返回值
本文关键字:返回值 读取 | 更新日期: 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(虽然部分原因是我已经知道该怎么做,我没有开始免费试用来阅读其余部分)
希望这有帮助!