2

関数本体内で例外が発生した場合、T の新しい空の型を返すにはどうすればよいですか?

xml のデシリアライズ中に問題が発生した場合に、新しい T() に x する最良の方法は何でしょうか?

どのように catch ブロックを取得したかを調べてください。これをどのように処理しますか?

        public static T DeserializeXml<T>(this string xml) where T : class
    {

        XmlDocument doc = new XmlDocument();
        MemoryStream ms = new MemoryStream();
        StreamReader sr = null;
        T x = null;
        //
        try
        {
            doc.LoadXml(xml); doc.Save(ms);
            ms.Position = 0;
            sr = new StreamReader(ms);
            XmlSerializer i = new XmlSerializer(typeof(T));
            x = (T)i.Deserialize(sr);
        }
        catch (Exception) {
            x = null;
        }
        finally {
        sr.Close(); sr.Dispose(); ms.Close(); ms.Dispose();
        }
        //
        return x as T;
    }
4

4 に答える 4

3

デフォルトを使用できます。

return default(T);
于 2012-10-25T05:18:45.483 に答える
3

T空のコンストラクターを持つように制約できます。それはあなたが求めているものですか?

public static T DeserializeXml<T>(this string xml) where T : class, new()
{
    //...
    catch
    {
        x = new T();
    }
    //...
    return x as T;       
}
于 2012-10-25T05:18:55.967 に答える
2

あなたが本当にする必要があるのは、

catch (Exception) {
    x = default(T);
}

または似たようなもの。本当に、句だけreturn nullでできます。catch電源プラグを抜かない限り、finally句は引き続き実行されることが保証され、where T: class制約により default(T) が常に null になることが保証されます。

usingそれらを閉じて破棄する代わりに、いくつかのブロックを使用することを検討してください。finallyその後、ブロックはまったく必要ありません。

public static T DeserializeXml<T>(this string xml) where T : class
{

    XmlDocument doc = new XmlDocument();
    using (MemoryStream ms = new MemoryStream())
    {
        using (StreamReader sr = new XmlSerializer(typeof(T))
        {
            T x = null;

            try
            {
                doc.LoadXml(xml); doc.Save(ms);
                ms.Position = 0;
                sr = new StreamReader(ms);
                XmlSerializer i = new XmlSerializer(typeof(T));
                x = (T)i.Deserialize(sr);
            }
            catch (Exception) {
                return null;
            }
        }
    }
    return x;
}
于 2012-10-25T05:18:57.290 に答える
2

返すかdefault(T)、またはジェネリック型where T : new()に制約を追加することができます。その場合、返すことができますnew T()

基本的に、が値型なのか参照型なのかdefault(T)分からない場合に使用します。Tクラスの場合はnull、数値型の場合はゼロ、構造体の空のインスタンスなど、さまざまな型に対してさまざまなものを返します。MSDNに良い記事があります。

于 2012-10-25T05:19:02.120 に答える