2009-10-13 7 views
0

익명 메서드/대리자에서 문자열 값을 반환하려고합니다. 나는 이런 식으로 뭔가를 달성 할 수있는 방법 : 컴파일시 오류를 줄 것이다 이것을 참고 : 나는 또한 확장 메서드를 만들기 위해 노력하고 있어요 '익명 메서드/대리자에서 형식을 반환하는 방법

  StringBuilder sb = new StringBuilder("aaa"); 
      sb.Replace("aaa", delegate() 
      { 
       return "bbb"; 
      }); 

대리자 형식이 아니기 때문에'문자열을 '입력 익명 메소드를 변환 할 수 없습니다 그래서 나는 다음과 같은 코드를 작성할 수 있습니다 :

StringBuilder sb = new StringBuilder("aaa"); 
sb.Replace("aaa",() =>     
{ 
    return "bbb"; 
}); 

확장 메소드의 서명은 무엇입니까?

편집 :

우리는 지루한 XML 파일을 생성하는 큰 내부 클래스가 있습니다. 우리는이 방법을 더 읽기 쉽도록 만들고 싶습니다. 그래서 우리는에서 을 가고 싶어 :

StringBuilder sb = new StringBuilder(_repository.GetGenericXml1Template()); 
sb.Replace("$Placeholder", GetXml1Helper()); 

private void string GetXml1Helper() 
{ 
    StringBuilder sb = new StringBuilder(_repository.GetGenericXml2Template()); 
    sb.replace("$Var1", DB.Var1); 
    .... 
    return sb.ToString(); 
} 

그래서보다는 도우미 메서드 수십 약간 비슷한 일을하는 데 우리가 적어도 코드가 더 readble 만들고 싶어.

는 사람 :

StringBuilder sb = new StringBuilder(_repository.GetGenericXml1Template()); 
sb.Replace("$Placeholder",() => 
{ 
    StringBuilder sb = new StringBuilder(_repository.GetGenericXml2Template()); 
    sb.replace("$Var1", DB.Var1); 
    .... 
    return sb.ToString(); 
} 
); 
+0

서명은 Func 이지만, 왜 그런 식으로하고 싶습니까? 나는 당신이 달성하고자하는 것이 무엇이든간에 더 나은 해결책이 있다고 확신합니다. – Groo

+0

@Wololo, 내 대답을 확인해 봤어 ... – RameshVel

답변

0

Note this will give a compile time error: Cannot convert anonymous method to type 'string' because it is not a delegate type

귀하의 대리인이 괜찮 - 오류가 단지 Replace 두 번째 인수로 string을 기대하고 있기 때문에 여기에 사용할 수 없음을 말한다.

What would the signiture of the extension method be?

음,이 같은 :

static void Replace(this StringBuilder sb, Func<string> f); 

-하지만 당신이 원하는 왜? 어떤 유스 케이스가 성취합니까?

+0

우리는 큰 클래스가 즉시 XML을 만듭니다. 우리의 xml 파일은 깊이 중첩되어 있으므로 수십 개의 작은 도우미 메서드를 만드는 대신 익명 메서드를 사용하여 더 잘 읽을 수있는 방법을 시도해 보았습니다. 델리게이트는 다른 중첩 된 XML 레벨을 나타냅니다. 바꾸기 메서드는 xml 템플릿 파일의 $ 자리 표시자를 db –

0

이 문자열은 익명의 방법을 형성 반환 올바른 구문입니다. 문제가 다릅니다. 익명 메소드를 두 번째 인수로 StringBuilder.Replace()에 전달하려고합니다. 여기에는 문자열이 필요합니다.

어쨌든 왜이 작업을 수행하고 있습니까?

0
당신이 할 수있는

다음

StringBuilder sb = new StringBuilder(); 
Func<string> func = delegate() 
{ 
    return "HELLO"; 
}; 
sb.Replace("", func()); 

나는이의 사용을 볼 수 없지만 ...

+0

의 값으로 대체합니다.이 경우 확장 메서드를 만들려고합니다. 그의 익명 메서드는 괜찮습니다. –

+0

글쎄, 그는 "확장 방법"을 만들고 싶다고 썼다. 그래서 나는 그것이 단지 일종의 두 번째 질문 일 뿐이라고 생각했다. –

1

을 대신의 StringBuilder.ReplaceRegex.Replace을 살펴볼 수 있습니다. 그렇게하면 다음과 같은 작업을 할 수 있습니다.

Regex.Replace("Input string", "aaa", match => "bbb"); 

원하는대로 바로 할 수 있습니다.

0

게시자가 게시 한 예가 사소한 것이기 때문에 약간의 사용법이 명확하지 않습니다. 익명의 방법이 필요한 특별한 이유가 있습니까? 대신 정규 인스턴스 메소드 일 수는 없습니까?

1

당신은

기본 StringBuilder.replace 나던 이후 Func을 <>를 받아 .. 예상 실현하려 확장 방법을 사용해야합니다, 당신은 확장 메서드가 여기에 귀하의 요구 사항

을 충족하는 대체 만들어야합니다 샘플 코드.

public static class ExtensionMethods 
{ 
      public static StringBuilder replace(this StringBuilder Sb1,string input, 
      Func<string> anonymos) 
      { 
       return Sb1.Replace(input, anonymos.Invoke()); 
      } 
} 

는 당신은 확장이 도움이

 StringBuilder s1 = new StringBuilder(); 
     s1.Append("hai"); 
     s1.replace("hai",() => 
     { 
      return "bb"; 
     }); 

희망과 같은 방법을 대체 호출해야합니다.

관련 문제