2011-04-27 5 views
6

클래스 수준에서 위임을 선언하는 방식을 사용했습니다.C#/.NET 4.0에서 대리자 매개 변수를 사용하여 메서드를 작성하는 방법?

protected delegate void FieldsDelegate(); 

//and then write a method e.g. 

protected int CreateComponent(DbConnection cnctn, string tableName, Dictionary<string, object> changedFieldValues, FieldsDelegate fieldsDelegate) 

그러나 이것은 실제로 성 가시고 대리자가 어떤 것인지 즉시 볼 수 없습니다. 그래서 이렇게하고 싶습니다 :

protected int CreateComponent(DbConnection cnctn, string tableName, Dictionary<string, object> changedFieldValues, delegate void fieldsDelegate()) 

그래서 별도의 정의가 없습니다.

위와 같은 이유로 어떤 이유로 든 허용되지 않습니다. 어떻게해야합니까?

+0

MyOtherClass는 실제로 접미사'에서 Delegate'은'FieldsDelegate' 이미 아주 좋은 지표입니다 반환합니다. –

답변

12

.NET은 이제이 목적으로 ActionFunc 제네릭을 제공합니다.

이 경우 위임자는 매개 변수를 사용하지 않고 아무 것도 반환하지 않습니다.

// protected delegate void FieldsDelegate(); // Don't need this anymore 

protected int CreateComponent(
           DbConnection cnctn, 
           string tableName, 
           Dictionary<string, object> changedFieldValues, 
           Action fieldsDelegate 
          ) 

는 매개 변수로 문자열을했다 경우는 부울 매개 변수로 문자열을 가져다가 반환하는 경우

// protected delegate void FieldsDelegate(string s); 

protected int CreateComponent(
           DbConnection cnctn, 
           string tableName, 
           Dictionary<string, object> changedFieldValues, 
           Action<string> fieldsDelegate 
          ) 

:

// protected delegate bool FieldsDelegate(string s); 

protected int CreateComponent(
           DbConnection cnctn, 
           string tableName, 
           Dictionary<string, object> changedFieldValues, 
           Func<string, bool> fieldsDelegate 
          ) 
+0

동의하지 않으면 롤백 –

+0

@ 헹크 - 동의합니다. 교체 한 위임자를 포함하면 이해하기가 쉽습니다. –

5

당신은 일반 Action<T>를 사용할 수 및 Func<T> 및 이의 변형을 대리자로 사용하고 보너스는 별개의 대리인을 전혀 정의 할 필요가 없다는 것입니다.

Action<T>은 최대 16 개의 다른 유형 매개 변수를 사용합니다. Action<T1, T2> 및 최대; 각 유형 매개 변수는 동일한 위치에있는 메소드의 유형 매개 변수입니다. 그래서, Action<int, string>이 방법을 위해 일 것이다 : 그것은 값을 반환하는 방법입니다 제외

public void MyMethod(int number, string info) 

Func<T>은 동일합니다. 마지막 형식 인수는 반환 형식입니다. Func<T>은 여기에서 귀하가 사용하고자하는 것이 아닙니다.

: 의도로 보인다, 분명히 그 대리인 인수에 대한 인수가 어떻게 될지하게 이러한 일반적인 위임을 사용하여

public object MyOtherMethod(string message, int number) 

: Func<string, int, object>는 다음과 같은 방법이 될 것입니다.

public void MyMethod(Action<string, MyClass>, string message) 

메소드를 호출하면, 당신은 당신이이 stringMyClass을 필요로하는 방법을 전달해야합니다 알고 있습니다. 여기

public void MeOtherMethod(Func<int, MyOtherClass>, int iterations) 

, 당신은 당신이 int 매개 변수를 사용하는 방법을 전달해야합니다 알고,

관련 문제