2009-09-01 2 views
1

스위치의 모든 경우를 프로그래밍 방식으로 검색 할 수 있습니까? 나는 일리노이 주에서 어떤 생각을할지는 모르지만 어떻게해야할지 모르겠다. ...C# 스위치를 통해 반복 수행

사실 내 전역 문제는 다음과 같다. 나는 문자열과 함께 속성 이름을 가지고있다. 이 방법은 매우 중요하며 회귀는 허용되지 않습니다. 리팩터링이 이것을 어기는 것을 원하지 않기 때문에 모든 케이스 문자열이 실제로 내 객체의 실제 속성이라는 테스트 방법이 필요합니다. (주의 : 리팩터링 된 유효하지 않은 값에 대해 exceptino를 던지지 않도록 기본값이 반환됩니다.)

+0

궁금한 점 : 빌드 프로세스의 일부로이 검사를 실행 하시겠습니까? –

+0

아니요 클래스의 정적 생성자에 추가하거나 명시 적으로 호출하고 싶지만 빌드 프로세스 중에이를 수행한다고 상상할 수 있습니다. – Toto

답변

2

코드에서 문자열로 속성 이름을 직접 사용하지 않는 방법이 있습니다. 코드 스 니펫 here을 게시했습니다. 대신에 switch 문을 사용하는

그런 다음,이 같은 구현 : 당신이 두 가지 방법을 호출 할 때

private IDictionary<string, Action> _actions; 

public void RegisterAction(string propertyName, Action action) 
{ 
    _actions.Add(propertyName, action); 
} 

public void DoSomething(string propertyName) 
{ 
    _actions[propertyName](); 
} 

, 당신은 코드의 회원 클래스를 사용하는지 확인을 (링크 참조) 대신 사용 프로퍼티 명. 따라서 "마법 문자열"이 없기 때문에 코드가 리펙토링 (refactoring-proof)인지 확인할 수 있습니다.

안부

IL에서
+0

마지막으로 링크 된 게시물과 사전에 표시된 코드를 제안대로 사용하십시오! – Toto

1

스위치의 값을 얻기 사소한되지 않을 것 ...

대신 문자열의 스위치에 열거를 사용하는 경우, 당신은 쉽게 Enum.GetValues를 사용하여 열거 형의 값을 얻을 수 있습니다.

2

는 switch 문은 다음과 같이 뭔가로 컴파일 :

// ... 
L_000c: ldloc.1 
L_000d: ldstr "case1" 
L_0012: call bool [mscorlib]System.String::op_Equality(string, string) 
L_0017: brtrue.s L_0035 
L_0019: ldloc.1 
L_001a: ldstr "case2" 
L_001f: call bool [mscorlib]System.String::op_Equality(string, string) 
L_0024: brtrue.s L_0042 
L_0026: ldloc.1 
L_0027: ldstr "case3" 
L_002c: call bool [mscorlib]System.String::op_Equality(string, string) 
L_0031: brtrue.s L_004f 
// ... 

모든 경우에 이것을 제대로 분석 할 수있는 코드를 작성하는 작업의 공정한 금액이 될 것입니다.

내가 이것을 테스트 할 수있는 유일한 방법은 실제로 모든 사례를 커버하고 null PropertyInfo로 끝나지 않도록하는 것입니다. 작업하는 코드가 매우 중요하고 실패 할 수없는 경우에는 반사를 사용하는 것이 좋습니다. 보다 안전한 디자인으로 이동할 수 있습니까?

+0

그리고 스위치가 커지면 C# 컴파일러는 스위치 구현으로 해시 테이블을 생성합니다 ... 실제로 매우 IL 친화적이지 않습니다 :) –

+0

반대로 스위치가 작지 않은 경우 해시 테이블을 가져 오는 케이크 조각입니다 - 내 대답을 참조하십시오. –

+0

물론 나는 그것을하기가 쉽지 않을 것이라고 생각했다. 사실이 코드는 예외를 던질 수 있습니다. 단지 잘못된 문자열을 속성으로 사용하지 않으려 고합니다. – Toto

0

AWK 또는 Perl 등으로 스크립트를 작성하여 소스 자체를 검사하고 모든 빌드를 수행하기 전에 스크립트를 실행하십시오.

관련 문제