2010-12-07 4 views
2

내 목적은 다음 코드로 demostrated된다일반적인 방법은

void MyMethod<T>(T aMethod, params object[] aParams) where T: System.Delegate 
{ 
    aMethod.Invoke(aParams); 
} 

어떻게 이런 종류의 일을 할 수 있습니까?

답변

2

Unconstrained Melody을 사용하거나이를 허용하는 비트를 집어 넣을 수 있습니다.

한편, 실제로는 Invoke 메소드를 공개하지 않습니다. 할 수없는 일은 다음과 같이 할 수 없습니다.

void MyMethod(Delegate aMethod, params object[] aParams) 
{ 
    aMethod.DynamicInvoke(aParams); 
} 

? 나는 매개 변수는 유형이어야합니다 잘못된 유형 등

+0

필자는 매개 변수 유형 안전성을 어떻게 든 얻길 바랬습니다. – Max

+0

@Max : 직접 메소드를 호출하지 않는 이유는 무엇입니까? 나는 이것이 당신을 정말로 사는지 알지 못합니다. –

+0

일반적인 예외 처리 코드를 추출하고 싶습니다. – Max

0

T이 될 수 있기 때문에 실제로, 심지어 일반 버전과 안전 타임 컴파일하지 않았을 의미하지만, 당신은 어떤 제네릭을 필요가 없습니다

이 같은
void MyMethod(Action<object[]> aMethod, params object[] aParams) 
{ 
    aMethod(aParams); 
} 

void Print(params object[] output) 
{ 
    foreach (var o in output) 
     Console.WriteLine(o); 
} 

전화를 :

MyMethod(Print, 1, "Hello"); 
+0

매개 변수가없는 델리게이트 (MethodInvoker)에서는 작동하지 않습니다. – Max

1

내가 당신이 실제로 달성하려는 모르겠어요 : 단지 컴파일러 또는 런타임 System.Delegate에서 상속 할 수 있기 때문에, 어느 시점 것은 일반이 가지고 이상 :

void MyMethod<T>(System.Delegate aMethod, params object[] aParams) 
{ 
    aMethod.DynamicInvoke(aParams); 
} 

델리게이트 형식 제약 조건을 사용하여 까다로운 작업을 수행하려는 경우 http://code.google.com/p/unconstrained-melody/을 볼 수 있습니다.이 작업을 수행 할 수 있도록 일부 다시 작성합니다. 단지 Action<object[]> 사용

또는 - Action<T>, Action<T1,T2>에 과부하 또는 많이, 등

void MyMethod(Action<object[]> aMethod, params object[] aParams) 
{ 
    aMethod(aParams); 
} 

//or 
void MyMethod<T>(Action<T> aMethod, T param) 
{ 
    aMethod(param); 
} 

void MyMethod<T1, T2>(Action<T1, T2> aMethod, T1 param1, T2 param2) 
{ 
    aMethod(param1, param2); 
} 

나는 과부하의 거대한 목록을 좋아하지만, 어떤 경우에는 그들은 최고의 라이브러리를 정말를 제공 할 유용성.

관련 문제