씨# ?? ? : 질문
-
22-08-2019 - |
문제
프로젝트를 위해 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.