2013-02-11 2 views
1

분명히 이것은 무력한 상황에 있지 않는 한 원하는 것이 아니지만 누구나 이와 같은 좋은 예가 될 수 있습니다 (생각할 때 보너스 포인트가 있음). 명확한 방법 이름) : 내가 가진문자열을 알 수없는 기본 유형으로 변환 (최선의 추측)

public static object ConvertToBestGuessPrimitive(string toConvert) 
{ 
    if(looksLikeAnInt) 
    { 
     return as an int; 
    } 
    else if(looksLikeABoolean) 
    { 
     return as a boolean; 
    } 
    else 
    { 
     return as a string; 
    } 
} 

유일한 아이디어는 함께 체인 현명한 위해 함께 TryParse 방법의 무리이고 아무것도 작동하지 않는 경우 문자열로 다시 떨어진다. 누구든지 더 나은 것을 생각할 수 있습니까? 이 질문은 이미 어딘가에서 이미 답변되었지만 일반적으로 지나치게 일반적인 검색어를 사용하면 유용한 결과를 찾지 못하는 것 같습니다.

편집 - 예가 없으면 이것이 얼마나 유용 할 것인가에 대한 비판이 있었기 때문에 구체적인 필요를 충족시키기 위해 내놓은 것은 여기에있다. (나는 믿기지가 않는다.) ... 내가 얻은 오류 로그 파일을 파싱한다고 가정 해 보겠다. 통제되지 않은 출처에서. 로그 파일에는 오류가 발생한 위치에 제공된 메소드 이름과 인수가 있습니다. 가장 일치하는 메서드와 인수를 찾아서 다시 호출하려고 시도하여 오류 조건을 테스트하는 작업을 자동화하려고합니다. 어쩌면 어리석은 예가 될 수 있습니다. (다만이 예제에서 볼 수 있듯이 "이 시나리오에서는 응답을 시도 할 수는 없지만 시도해보십시오.)하지만 몇 가지 사항을 보여줍니다. 1) 입력이 제어 할 수 없습니다. 2) 최선의 추측은 적절한 일치를 찾는 몇 가지 기준에 근거합니다. 예 : "10/2/2012"는 문자열보다 DateTime을 의미 할 가능성이 큽니다.

+0

그 방법을 동적으로 선언하지 않는 이유는 Switch 문을 쓰는 이유입니다. 여기서 'toConvert'를 사용하여 검사하는 경우도 있습니다. 메서드 이름 이제 시작하는 방법을 설명하는 메소드 이름이 나오기에 충분히 똑똑해야합니다. 당신이하고있는 일이나하려고 한 일, 예를 들어'ConvertToPrimitiveType' – MethodMan

+1

나는 그것을 얻지 못합니다. 이 방법을 어떻게 사용 하시겠습니까? 어떻게 유용 할 수 있습니까? – nmat

+0

@nmat에 동의합니다. 어쩌면 당신이 그것을 사용하고 싶은지에 대한 예를 보여줄 수 있습니다. –

답변

0

사실 구문 분석은 문화권에 따라 다르므로 가장 올바른 방법입니다. .NET Framework에 구문 분석을 요청하면 현재 문화권 설정을 자동으로 준수하게됩니다. 이는 잠재적으로 Regex 기반의 수동 구문 분석 방식과는 대조적입니다.

또한 bool, int, float 및 DateTime 중에서 모호하게 해석 될 수있는 문자열을 알지 못합니다. (모든 int가 float이기 때문에 int를 먼저 구문 분석하는 명백한 예외가 있음).

더 좋은 이름은 ConvertToBestGuessPrimitiveType입니다. "유형"을 추가했습니다.

1

그래서 if-elses를 없애고 싶습니까? 다음과 같은 경우는 어떻습니까?

interface IConverter 
{ 
    bool TryConvert(string obj, out object result); 
} 

class IntConvert : IConverter 
{ 
    public bool TryConvert(string obj, out object result) { /* stuff here */ } 
} 

class BoolConverter : IConverter {...} 

// etc. 
List<IConverter> converters = new List<IConverter>(); 
converters.Add(new IntConvert()); 
converters.Add(new BoolConvert()); 

public static object ConvertToBestGuessPrimitive(string toConvert) 
{ 
    object obj; 
    foreach(var converter in converters) { 
    if(converter.TryConvert(toConvert, out obj)) 
     return obj; 
    } 

    return null; 
} 

업데이트 : 제안에 감사드립니다.

+1

각 문자열을 수표로 두 번 파싱 한 다음 메서드를 변환합니다. TryParse 메서드로 결합하는 것이 더 좋습니다. – Servy

+0

확실히 동의합니다. 제안에 감사드립니다. 예제를 업데이트했습니다. –

관련 문제