문제

프로젝트를 위해 XML 사제를 구축하고 있으며 이러한 유형의 코드 상황을 상당히 자주 실행합니다.

var myVariable = ParseNDecimal(xml.Element("myElement")) == null ? 
                 0 : ParseNDecimal(xml.Element("myElement")).Value;

이 진술을 작성하는 더 좋은 방법이 있습니까?

편집 : 아마도 문자열을 소수점으로 구문 분석하는 도우미 방법이 있으므로 내 예를 명확히했을 것입니다.

도움이 되었습니까?

해결책

확장 방법을 사용할 수 있습니다.

public static T TryGetValue<T>( this XmlElement element ) {
    if ( null == element ) return default(T);
    return (T)element.Value;
}
...
...
var myVariable = xml.Element("myElement").TryGetValue<decimal>();

편집하다:

"유니버설"솔루션 :

static class Program {
    static void Main() {
        var xmlDecimal = new XElement( "decimal" );
        xmlDecimal.Value = ( 123.456m ).ToString();
        decimal valueOfDecimal_1 = xmlDecimal.ValueAs<decimal>( decimal.TryParse );
        bool valueOfBool_1 = xmlDecimal.ValueAs<bool>( bool.TryParse );

        var xmlBool = new XElement( "bool" );
        xmlBool.Value = true.ToString();
        decimal valueOfDecimal_2 = xmlBool.ValueAs<decimal>( decimal.TryParse );
        bool valueOfBool_2 = xmlBool.ValueAs<bool>( bool.TryParse );
    }
}

public static class StaticClass {
    public delegate bool TryParseDelegate<T>( string text, out T value );
    public static T ValueAs<T>( this XElement element, TryParseDelegate<T> parseDelegate ) {
        return ValueAs<T>( element, parseDelegate, default( T ) );
    }
    public static T ValueAs<T>( this XElement element, TryParseDelegate<T> parseDelegate, T defaultValue ) {
        if ( null == element ) { return defaultValue; }

        T result;
        bool ok = parseDelegate( element.Value, out result );
        if ( ok ) { return result; }

        return defaultValue;
    }
}

다른 팁

편집하다: 편집 된 질문이 주어지면 훨씬 간단합니다.

다시 확장 방법을 사용하지만 이제 방법에서 변환 할 필요가 없습니다.

var myVariable = ParseNDecimal(xml.Element("myElement").ValueOrDefault("0"));

...

public static string ValueOrDefault(this XElement element, 
                                     string defaultValue)
{
    return element != null ? element.Value : defaultValue;
}

문자열 매개 변수를 취하는 메소드가 마음에 들지 않으면 object 그리고 전화 ToString, 그런 다음 다음과 같이 부릅니다.

var myVariable = ParseNDecimal(xml.Element("myElement").ValueOrDefault(0m));

그러나 그것은 나에게 약간 잘못된 느낌이 듭니다. 구문 분석이 반대가 될 것이라고 가정합니다. ToString 서식.

원래 답변

당신을 도울 언어에는 특히 아무것도 없습니다. (정확한 코드가 올바른지 잘 모르겠습니다. XAttribute?) 유틸리티 방법을 작성하는 것이 좋습니다.

var myVariable = xml.Element("myElement").ValueOrDefault(0m);

...

public static decimal ValueOrDefault(this XElement element, 
                                     decimal defaultValue)
{
    return element != null ?(decimal) element.Value : defaultValue;
}

질문에서 코드를 조정하면 여기에서 코드도 마찬가지입니다. 나는 당신을 의심합니다 했다 사용하는 것을 의미합니다 XAttribute, 제네릭에 문제가 생깁니다. 나는 당신이 XAttribute "소수로 변환"연산자. 컴파일 타임에 어떤 종류의 변환을 원하는지 모르기 때문에 일반적인 캐스트는 그렇게하지 않습니다. 그러나 관심있는 모든 결과 유형에 대한 위의 방법을 과부하 할 수 있습니다.

당신은 그것을 사용할 수 있습니까 ?? 운영자는 이것을 좀 더 깨끗하게 작성하지만, 당신이해야한다고 확신하지 못합니다 ...

Element() 그 이름을 가진 자식 요소가 없다는 Null을 반환합니다. 그래서 당신이 사용할 수있는 곳입니다 ?? 기본 요소로 슬라이드합니다. 호출하기 전에이 작업을 수행해야합니다. (decimal) 깁스:

var myVariable 
    = (decimal)(xml.Element("myElement") ?? new XElement("myElement", 0));

내가 말했듯이, 이것이 효과가있을 때, 나는 당신이 확실하지 않습니다. ~해야 한다 이 작업을 수행. ymmv.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top