我不确定我是否正确理解了委托的用法,但我想在发布者类中阅读委托返回值。下面的示例如下所示。
//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
}
答案 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 (虽然这部分是因为我已经知道该怎么做了,而且我没有开始免费试用以阅读其余部分)
希望这有帮助!