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グローバルな状態になるため、後で結合の問題が発生したり、単体テストが困難になったりする可能性があるため、避けることをお勧めします。

これまでに与えられた他の答えには、コールバックがnullであるかどうかをチェックするガード句があります。それが予想される動作(コールバックがnullである)でない限り、私はこれを避けます。後でエラーをデバッグするのが難しくなるよりも、早くクラッシュする方がよいでしょう。

また、サーバーを非静的にしようとします。

于 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()
}

ただし、次を使用してデリゲートをまとめて作成することを避けることができますFunc

public static Func<List<string>> Callback;
于 2012-04-16T12:28:11.400 に答える