سؤال

أنا بناء XML Deserializer عن مشروع كنت تعمل عبر هذا النوع من التعليمات البرمجية الوضع إلى حد ما في كثير من الأحيان:

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() يعود لاغية من عدم وجود عنصر تابع بهذا الاسم، لذلك هذا هو المكان الذي يمكن أن تستخدم ؟؟ الانزلاق في عنصر الافتراضية. تحتاج إلى القيام بذلك قبل الاحتجاج المدلى بها (decimal):

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

وكما قلت رغم ذلك، في حين أن هذا سوف أعمل، وأنا لست متأكد أنك <م> يجب قيام بذلك. YMMV.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top