2016-10-18 13 views
0

Type型のパラメータ(およびいくつかのパラメータ)と、型を欲しい汎用関数を使用する関数の違いはangle bracketですか?汎用関数と型パラメータを持つ関数の相違

考え方:XMLファイルとしてファイルシステムに型を保存する関数を記述したいと思います。 XmlSerializerには、シリアル化するオブジェクトの型が必要なので、私は知りたい:何が良いですか?

private bool SerializeIt(object o, Type t, string filePath) 
{ 
    bool result = false; 
    try 
    { 
     if (File.Exists(filePath)) 
      File.Delete(filePath); 

     XmlSerializer serializer = new XmlSerializer(t); 
     using (FileStream fs = new FileStream(filePath, FileMode.CreateNew, FileAccess.Write)) 
     { 
      serializer.Serialize(fs, o); 
     } 
     result = true; 
    } 
    catch (Exception ex) 
    { 
     result = false; 
     Debug.WriteLine(ex); 
    } 

    return result; 
} 

private bool SerializeIt<T>(T o, string filePath) 
{ 
    bool result = false; 
    try 
    { 
     if (File.Exists(filePath)) 
      File.Delete(filePath); 

     XmlSerializer serializer = new XmlSerializer(o.GetType()); 
     using (FileStream fs = new FileStream(filePath, FileMode.CreateNew, FileAccess.Write)) 
     { 
      serializer.Serialize(fs, o); 
     } 
    } 
    catch (Exception ex) 
    { 
     result = false; 
     Debug.WriteLine(ex); 
    } 

    return result; 
} 
+0

'o'パラメータを' object'の代わりに 'T'に変更すると意味があります。 –

+0

@MikeEason:done – Radinator

+0

この場合、コンパイル時にその型に頼っていないので、ジェネリックはメソッド自体に何も追加しません。だから私はジェネリックスや型パラメータの必要性を見ていないので、あなたはnullを処理する必要がない限り、どちらの場合でも 'o.GetType()'を使うことができます。 nullが問題の場合、汎用バージョンにはエラーがあります。 –

答えて

2

それはあなたが指定したタイプですので、あなたの第一の方法は、タイプSomeData1で動作します。もう1つの方法は、Tに渡されるすべての型で動作します。

typeof(SomeData1)ではなく、o.GetType()で上記の問題を解決できます。それでも、2番目の方法は、派生クラスのすべてのプロパティをクリアするシリアライゼーションベースとして基本クラスを使用する機会を与えます。

+0

最後の文章は私が検索したものです。ありがとう! – Radinator

1

機能private bool SerializeIt(object o, Type t, string filePath)は実行時に評価されます。 関数private bool SerializeIt<T>(T o, string filePathはコンパイル時に評価されます。それは指定された型をILコードに挿入しています。

1

多くの違いがあります。まず、ジェネリックパラメータの制約を作成できます。例:

private bool SerializeIt<T>(T o, string filePath) where T: ISomething 

ジェネリック型の2次型の推論を作成できます。

private bool SerializeIt<T>(T o, string filePath) 

Something something = new Something(); 
o.SerializeIt(something, ""); // dont need to pass type (can infer from first argument). 

第三に - あなたは例えば、コンクリートの強いタイプで作業:

private bool SerializeIt<T>(T o, string filePath) 

は、一般的には、インターフェースが簡単かつきれいになります。緩く型付けされたオブジェクトを使用する必要はありません。

関連する問題