제네릭 대리자 (Generic Delegate)

2022. 1. 27. 00:00CSharp/Advance

반응형
public delegate void Del<T>(T item);
public static void Notify(int i) { }

Del<int> m1 = new Del<int>(Notify);
// 다음과 같이 간소화 할수 있다.
Del<int> m2 = Notify;

 

클래스 내에 정의된 대리자는 클래스 메서드와 같은 방식으로 제네릭 클래스 형식 매개 변수를 사용할 수 있다.

public class MyStack<T>
{
    T[] items;
    int index;

    public delegate void StackDelegate(T[] items);
}

 

사용 방법은 아래와 같다.

 

public void Run()
{
    MyStack<float> s = new MyStack<float>();
    MyStack<float>.StackDelegate d = DoWork;

    d(new[]{12.3f, 12.4f,12.5f});
}
private void DoWork(float[] items)
{
    foreach (var item in items)
        Console.WriteLine(item);
}

 

제네릭 대리자는 sender 인수를 강력하게 형식화할 수 있고 더 이상 sender 인수와 Object 간에 캐스팅하지 않아도 되기 때문에 일반적인 디자인 패턴을 기반으로 하는 이벤트를 정의할 때 특히 유용한다.

 

public delegate void MyStackEventHandler<T, U>(T sender, U eventArgs);
public class MyStack<T>
{
    T[] items = { };
    int index;

    public class MyStackEventArgs : System.EventArgs
    {
        public T Item { get; init; }
    }
    public event MyStackEventHandler<MyStack<T>, MyStackEventArgs> mySatackEvent;
    protected virtual void OnStackChanged(MyStackEventArgs a)
    {
        mySatackEvent(this, a);
    }
    public virtual void Add(T item)
    {
        items.Append(item);
        OnStackChanged(new MyStackEventArgs() { Item=item});

    }

}
public class Test : ITest
{

    public void Run()
    {
        MyStack<float> s = new MyStack<float>();
        s.mySatackEvent += S_mySatackEvent;
        s.Add(12.3f);
        s.Add(12.4f);
        s.Add(12.5f);
    }

    private void S_mySatackEvent(MyStack<float> sender, MyStack<float>.MyStackEventArgs eventArgs)
    {

            Console.WriteLine(eventArgs.Item);
    }

}

 

 

관련영상

https://youtu.be/775aAaFzH0U

 

 

 

 

반응형

'CSharp > Advance' 카테고리의 다른 글

LINQ 란  (0) 2022.01.31
제네릭 리플렉션 (Generic Reflection)  (0) 2022.01.28
제네릭 메서드 (Generic Method)  (0) 2022.01.26
제네릭 클래스 (Generic class)  (0) 2022.01.25
제네릭 컬렉션 (Generic Collection)  (0) 2022.01.24