대리자

// 다음과 같은 문장은
Transformer t = Square;

// 다음 문장을 줄여 쓴 것이다.
Transformer t = new Transformer(Square);

// 한편 다음과 같은 표현식은
t(3);

// 다음을 줄여 쓴 것이다.
t.Invoke(3);

대리자를 이용한 플러그인 메서드 작성

public delegate int Transformer (int x);

class Util
{
  public static void Transform(int[] values, Transformer t)
  {
    for (int i = 0; i < values.Length; i++)
      values[i] = t(values[i]);
  }
}

class Test
{
  static void Main()
  {
    int[] values = { 1, 2, 3, };
    Util.Transform (values, Square);
    foreach(int i in values)
      Console.Write(i + " ");  // 1 4 9
  }

  static int Square (int x) => x * x;
}

다중 캐스트 대리자

다중 캐스트 대리자 예제

public delegate void ProgressReporter (int percentComplete);

public class Util
{
  public static void HardWork (ProgressReporter p)
  {
    for (int i = 0; i < 10 i++)
    {
      p (i * 10);
      System.Threading.Thread.Sleep(100); // 어려운 작업을 흉내냄.
    }
  }
}

class Test
{
  static void Main()
  {
    ProgressReporter p = WriteProgressConsole;
    p += WriteProgressToFile;
    Util.HardWork(p);
  }

  static void WriteProgressToConsole (int percentComplete)
    => Console.WriteLine(percentComplete);

  static void WriteProgressToFile(int percentComplete)
    => System.IO.File.WriteAllText("progress.txt",percentComplete.ToString());
}

대상 메서드로서의 인스턴스 메서드 대 정적 메서드

제너릭 대리자 형식