2016-09-15 4 views
1

이 같은 XML 파일에서 텍스트 가져 오는 기능이 :이 같은 문자열 보간 상수에 넣을 XML 지금문자열 보간 문자열

var text = Translate("/foo/bar"); 

을 :

<foo> 
    <bar>Hi, {firstName} {lastName}!</bar> 
</foo> 

그래서, 나는 번역 기능의 결과에 문자열 보간을하고 싶은, 그 것이 뭔가 같은 :

var firstName = "John"; 
var lastName = "Smith"; 
var formattedText = $Translate("/foo/bar"); 

하지만 그건 효과가없는 것 같습니다. 문자열로 되 돌리는 것을 제외하고는이 방법이 있습니까?

달러 기호를 문자열이 아닌 문자열, 변수, 문자열 또는 함수 앞에 배치하여 문자열 보간을 수행하는 것이 좋을 수 있습니다.

제 3 자 구성 요소에 있기 때문에 Translate 함수의 코드를 제어 할 수 없다는 점을 언급 할 가치가 있습니다.

+1

는 이런 종류의 일을 위해 작성된 몇 가지 유틸리티 클래스가 있습니다 (예를 들어,, [FormatWith] (http://james.newtonking.com/archive/2008/03/29/formatwith-2-0-string-formatting-with-named-variables)). 그러나 그들은 문서화되지 않은 특이성을 갖는 경향이 있습니다. 이것은 타입 시스템의 보호를 희생 시키지만 런타임 문자열 포맷의 고유 한 단점입니다. – Brian

답변

8

아니요,이 작업을 수행 할 수 없습니다. 문자열 보간은 컴파일 시간 ()에서 수행됩니다. 컴파일러는 보간 된 문자열 리터럴을 검사하고 관련 형식 문자열을 찾아서 {0} 등으로 변환합니다. 실행시이 작업을 수행하는 것과 비슷한 기능은 없습니다.

4

당신은 그렇게 할 수 없습니다.

문자열 보간은 부분 컴파일러 마술이므로 일반 문자열에 문자열 보간을 삽입 할 수 없습니다. Translate 메서드를 변경할 수 없기 때문에 여전히 문자열을 반환하므로 직접 처리해야합니다.

모든 무거운 때문에 (등, 실제 문자열을 재 작성을 추출, 표현을 찾기가)이 작업을 수행하는 데 도움 수있는 런타임 클래스가없는 컴파일시에 이루어집니다. 당신이 가진 모든 사물의 이름입니다 경우 지금


,하지 표현은 반환 된 문자열에서, 당신은 이 스스로 않습니다. 즉, 표시된 정확한 예는 이 아니어야합니다.입니다. 그러나, 여전히 같은 "문자열 보간"되지 않을 것, 그것은 자신의 일이 될 것입니다. 반환 된 문자열 이제까지 ".... {firstname:-40} ..." 같은 것을 포함 된 경우 즉, 당신은 힘든 타고에있어.

간단한 순진 솔루션은 간단한 문자열 교체 작업을 수행하는 것입니다 :

var formattedText = $Translate("/foo/bar") 
    .Replace("{firstname}", firstname) 
    .Replace("{lastname}", lastname); 
4

익명 (또는 정의 된 객체)로 변수를 변화시킬 수 있다면, 당신은 SmartFormat (https://github.com/scottrippey/SmartFormat.NET)를 사용할 수 있습니다.

var obj = new [MyClass - optional, if declared] 
{ 
    FirstName = "John", 
    LastName = "Smith", 
} 

var formattedText = Smart.Format(Translate("/foo/bar"), obj); 

이해로 코드가 작동하지 않는 이유

는, 보간 된 문자열이 컴파일 시간 동안하지 런타임 중에, (그것의 변수)를 평가한다는 것입니다.