2011-02-09 3 views
1

반복적 인 코드를 사용하여 개체 목록 (모든 INamed 목록)에서 확인란 목록을 생성하는 제네릭 함수를 리팩토링하려고합니다.어떻게이 함수를 매개 변수로 델리게이트와 함께 호출 할 수 있습니까?

두 번째 매개 변수는 함수로 다시 호출 할 수 있지만 실제로이 메서드를 호출하는 방법을 알아낼 수없는 대리자입니다. 이 대리자를 사용하여 메서드를 호출하는 가장 좋은 방법은 무엇입니까?

if (has(item)) // This calls the delegate 

호출 : 여기

public delegate bool HasHandler(INamed named); 

(내가 Checkboxlist 함수를 호출 할 코드의 예를 찾고 있어요 것은) 당신은 지금하고있는

static public string CheckboxList(IQueryable<INamed> allItems, HasHandler has, string name) 
    { 
     StringBuilder b = new StringBuilder(); 
     foreach (var item in allItems) 
     { 
      if (has(item)) 
      { 
       b.Append("<input type='checkbox' class='checkboxes' name='" + name + "' value=" + item.Id + " checked />" + item.Name); 
      } 
      else 
      { 
       b.Append("<input type='checkbox' class='checkboxes' name='" + name + "' value=" + item.Id + " />" + item.Name); 
      } 
     } 
     return b.ToString(); 
    } 
+1

가 오류를 받고 있습니까? –

+0

제쳐두고, 이와 같은 방법으로 HTML을 빌드 할 때마다 더 좋은 방법이 있습니다. –

+0

@Justin Morgan -이 예제에 대한 구체적인 제안 사항이 있습니까? – leora

답변

4

일반적인 방법을입니다 메소드 내의 delegate 당신이 가지고있는 문법은 정확하며 작동해야합니다.


전화는 CheckboxList입니다. 위임을 정의해야하는 것처럼 들립니다. 이것은 "INamed"를 인수로 사용하여 부울 값을 반환하는 모든 메서드가 될 수 있습니다. 당신이 가지고 예를 들어, :

private bool myHandler(INamed named) 
{ 
    return true; 
} 

당신은이 호출 할 수 있습니다 또는

string result = CheckboxList(items, myHandler, "Foo"); 

을, 당신은 여기에 람다를 전달할 수 :

string result = CheckboxList(items, named => { return (named.Foo > 3); }, "Foo"); 
+0

질문이 더 명확하게 업데이트되었습니다. – leora

+0

@ooo - 괜찮습니다 - 조금 업데이트했습니다 ... –

0

아주 간단한 예 :

public delegate bool HasHandler(INamed named); 

// delete method matching HasHandler declaration 
bool MyHandler(INamed named) { 
    return true; 
} 

// method that passes your implemented delegate method as a parameter 
void MyOtherMethod() { 
    MyMethod(null, (n) => MyHandler(n)); // using lambda 
    MyMethod(null, MyHandler); // not using lambda 
} 

// method that uses your implemented delegate method 
// this would be like your CheckboxList method 
void MyMethod(INamed o, HasHandler handler) { 
    handler(o); 
} 

식별자 handlero (대상이 INamed)을 매개 변수로 사용 중입니다.

편집

당신의 CheckboxList 메소드를 호출의 예 :

CheckboxList(myItems, (n) => MyHandler(n), "myName"); 
+0

질문이 더 명확하게 업데이트되었습니다. – leora

+0

@ooo : 내 대답이 업데이트되었습니다. – bitxwise

0
CheckBoxList(yourItems, x => x.SomeProperty == "foo", "yourName"); 
관련 문제