C# Delegate
TestDelegate testDelegate = null; testDelegate += (a, b) => { return (a + b); }; testDelegate += (a, b) => { return (a - b); }; testDelegate += (a, b) => { return (a / b); }; testDelegate += (a, b) => { return (a * b); }; Debug.WriteLine(testDelegate(10, 20));
/// <summary>/// MulticastDelegate를 이용해 여러 메소드를 실행 할 때 각각의 반환값을 받아 온다. /// </summary> /// <typeparam name="T">return object type</typeparam> /// <param name="func">Delegate[]를 반환하는 Func</param> /// <param name="args">delegate가 실행에 필요한 인자 값</param> /// <returns>delegate가 실행되고 반환된 리턴값들</returns> /// <remarks> /// 동적인 delegate의 결과값을 IEnumerable<T>로 받아 오기 /// </remarks> /// <exception cref="ArgumentNullException"> /// Null 을 넘겨 주면 발생 /// </exception> /// <exception cref="InvalidCastException"> /// Generic가 제대로 선언되지 않으면 발생 /// </exception> /// <example> /// delegate int TestDelegate(int a, int b); /// TestDelegate testDelegate = null; /// testDelegate += (a, b) => { return (a + b); }; /// testDelegate += (a, b) => { return (a - b); }; /// testDelegate += (a, b) => { return (a / b); }; /// testDelegate += (a, b) => { return (a * b); }; /// GetDelegateInvokeResults<int>(() => delegate.GetInvocationList(), 1, 2); //호출시 generic 방법으로 반환될 형식을 정의 함. /// </example> public IEnumerable<T> GetDelegateInvokeResults<T>(Func<Delegate[]> func, params object[] args) { List<T> list = new List<T>(); //인자로 받은 Func를 실행한다. var delList = func.Invoke(); //Delegate[]를 loop foreach (var del in delList) { //동적 인자로 실행하고 반환값을 List에 넣는다. list.Add((T)del.DynamicInvoke(args)); } return list; }
delegate를 동적으로 컨트롤 하기 위해서 Func와 params 라는 개념을 도입을 하여 메소드를 만들었다.
위 메소드를 아래와 같이 사용하여 results에 담아 올 수 있다.
TestDelegate testDelegate = null; testDelegate += (a, b) => { return (a + b); }; testDelegate += (a, b) => { return (a - b); }; testDelegate += (a, b) => { return (a / b); }; testDelegate += (a, b) => { return (a * b); }; var results = GetDelegateInvokeResults<int>(() => testDelegate.GetInvocationList(), 10, 20);
이렇게 되면 결과값을 가지고 지지고 볶을 수 있을 것이다.
다음에 기회가 된다면 일률적인 값으로 파라메터를 넘기는 것이 아닌 각각의 delegate마다 다른 파라메터를 넘길 수 있는 방안을 알아 보도록 하겠다.
'.Net Framework' 카테고리의 다른 글
[C# Compress] MemoryStream Compress (0) | 2013.02.15 |
---|---|
[C# Compress] GZipStream - 문자열 압축과 해제 (0) | 2013.02.15 |
[C# FileSystemWatcher] 디렉토리, 파일 변경 모니터링 클래스 (0) | 2013.02.15 |
What?!? C# Could Do That??? (0) | 2012.11.12 |
MVVM Applied in Windows Phone and Windows 8 (0) | 2012.11.12 |