2016-12-16 1 views
0

int와 double과 같은 다른 반환 유형의 메소드가 있습니다.다른 retun 유형을 사용하는 일반 대리자

하지만 지금은 다른 방법으로 반복 해 보겠습니다.

나는 이런 식으로 시도 :

delegate T MeDelegate<T>(); 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Func<int> d = ReturnFive; 
      d += ReturnTen; 
      d += ReturnTwentyTwo; 
      d += returnDoubles; 

      foreach (int i in GetAllReturnValues(d)) 
       Console.WriteLine(i); 
      Console.ReadKey(); 


     } 

     static IEnumerable<TArgs> GetAllReturnValues<TArgs>(Func<TArgs> d) 
     { 

      List<int> ints = new List<int>(); 
      foreach (Func<TArgs> item in d.GetInvocationList()) 
       yield return item(); 


     } 

     static int ReturnFive() { return 5; } 
     static int ReturnTen() { return 10; } 
     static int ReturnTwentyTwo() { return 22; } 
     static double returnDoubles() { return 1.0; } 

    } 

및 당연히이 : Func<int> d

나던 작품. 그러나 이것을 향상시키는 방법은 무엇입니까?

은 당신이 원하는 여부를 무슨 경우

+1

. func의 타입은 컴파일시에 설정되며, double이 아닙니다. 여기에 어떤 것을 시도하고 있는지 확실하지 않지만 이와 같은 작업을 수행해야하는 경우 반환 값을 캡슐화하고 제네릭을 완전히 삭제하는 유형을 반환하십시오. – Will

+0

방금 ​​d에 이벤트를 첨부하고 있습니다. 함수에 대한 포인터를 d에 넣고 싶습니다. func [] d = 새 기능 [] {ReturnFive, ReturnTen, ReturnTwentyTwo, returnDoubles}; – Muckeypuck

답변

0

잘 모르겠어요 감사하지만, 아래의 코드를 사용하려고합니다.

delegate T MeDelegate<T>(); 
class Program 
{ 
    static void Main(string[] args) 
    { 
     Func<object> functionDelegates = ReturnFive; 
     functionDelegates += ReturnTen; 
     functionDelegates += ReturnTwentyTwo; 
     functionDelegates += ReturnSomeDoubleValue; 

     foreach (object value in GetAllReturnValues(functionDelegates)) 
     { 
      Console.WriteLine(value); 
     } 
     Console.ReadKey(); 
    } 

    static IEnumerable<TArgs> GetAllReturnValues<TArgs>(Func<TArgs> functionDelegates) 
    { 
     return from Func<TArgs> function in functionDelegates.GetInvocationList() select function(); 
    } 

    static object ReturnFive() { return 5; } 
    static object ReturnTen() { return 10; } 
    static object ReturnTwentyTwo() { return 22; } 
    static object ReturnSomeDoubleValue() { return 1.0; } 

} 
+0

감사합니다! 아주 멋졌습니다 – SavantCodeEngineer

+0

@SavantCodeEngineer '동적'을 사용하지 않는 이유 –

+0

@AmitPore '동적'을 사용할 이유가 없습니다. – Servy

0

+ = wires events. 당신이하고 싶은 것은 배열에 저장하는 것입니다. 당신이 달성하기 위해 노력하고 있지만 다른 반환 형식과 기능을 원하는 경우, 당신이 할 수있는 것을

class Program 
    { 
     static void Main(string[] args) 
     { 
      Func<object>[] d = new Func<object>[] { ReturnFive, ReturnTen, ReturnTwentyTwo, returnDoubles }; 

      foreach (object i in GetAllReturnValues<object>(d)) 
       Console.WriteLine(i); 
      Console.ReadKey(); 


     } 

     static IEnumerable<object> GetAllReturnValues<TArgs>(Func<object>[] d) 
     { 

      List<int> ints = new List<int>(); 
      foreach (Func<object> item in d) 
       yield return item(); 


     } 

     static object ReturnFive() { return 5; } 
     static object ReturnTen() { return 10; } 
     static object ReturnTwentyTwo() { return 22; } 
     static object returnDoubles() { return 1.0; } 

    } 
+1

OP의 '+ ='사용에있어 아무 문제가 없습니다. C#의 모든 대표는 멀티 캐스트 대리인이므로 OP와 결합 할 수 있습니다. – Servy

+0

나는 내가 이것을 썼을 때 집에가는 길에 + = 및 invokeallinvocations에 대해 생각하기 시작했고 나는 아마 바보라는 것을 깨닫지 못했다. 확인해 주셔서 감사합니다. – Muckeypuck

-1

확실하지 항상 동적 당신은 할 수 없습니다

List<dynamic> allReturns = new List<dynamic>{ ReturnFive(), ReturnTen(), ReturnTwentyTwo(), returnDoubles() }; 

foreach (dynamic i in allReturns) 
     Console.WriteLine(i); 
    Console.ReadKey(); 
+0

실제로 여기에 '동적'기능을 사용하고 있지 않습니다. 이 코드는'object'를 사용했다면 똑같은 것을 똑같이 수행합니다. 단, 모든 것이 정적으로 바인딩 될 수 있기 때문에 더 빠르게 실행된다는 점이 다릅니다. – Servy

+0

@Servy 감사합니다. 왜 '동적'또는 '객체'를 사용하여 한 줄로 처리 할 수 ​​있는지 대리자를 작성하십시오. –

+0

예입니다. 이 문제를 설명하기 만하면됩니다. 아마도 실제 코드에는 메소드가 즉시 호출 될 수없는 좋은 이유가 있습니다. 아마도 호출 코드가 제공하는 매개 변수가 필요할 것입니다. 아마도 여러 번 호출되는 것입니다. 대리자를 사용하는 데는 많은 이유가 있으며 질문에 포함 된 모든 것을 포함하면 질문하는 질문에서 혼란을 겪을 수 있습니다. – Servy