2011-04-21 75 views
0

考慮以下幾點:擴展方法不規則行爲

public static class FileSerializer 
{ 
    public static void SaveToFile<T>(this T obj, String fileName) 
    { 
     String dbFile = Path.Combine(Application.StartupPath, fileName); 

     using (Stream stream = File.Open(dbFile, FileMode.Create)) 
     { 
      BinaryFormatter bFormatter = new BinaryFormatter(); 
      lock (obj) bFormatter.Serialize(stream, obj); 
     } 
    } 

    public static void LoadFromFile<T>(this T obj, String fileName, Boolean ensureExists) 
    { 
     String dbFile = Path.Combine(Application.StartupPath, fileName); 

     if (!File.Exists(dbFile)) 
      if (ensureExists) 
       throw new FileNotFoundException("File not Found!"); 
      else return; 

     using (Stream stream = File.Open(dbFile, FileMode.Open)) 
     { 
      if (stream.Length > 0) 
      { 
       BinaryFormatter bFormatter = new BinaryFormatter(); 
       obj = (T)bFormatter.Deserialize(stream); 
      } 
     } 
    } 
} 

即使我附加調試器,和OBJ在上面的代碼的最後一行,有記錄,當我使用的方法,例如:

lstServers.LoadFromFile("Servers.dat", false); 

lstServers is ALWAYS空。

任何想法爲什麼?

回答

1

LoadFromFile不應該是一個擴展方法,只是一個普通的靜態方法,它返回它的結果:

lstServers = FileSerializer.LoadFromFile("Servers.dat", false); 

的問題是分配給實例參數,並沒有對任何影響在方法外部傳遞給該參數的變量。您不能在擴展方法的實例參數中引用(refout),這是您使代碼正常工作所需的。

2

你基本上試圖改變參考obj這是不能這樣做的。你會得到最好的是它的非擴展版本:

public static T LoadFromFile<T>(String fileName, Boolean ensureExists) 
{ 
    String dbFile = Path.Combine(Application.StartupPath, fileName); 

    if (!File.Exists(dbFile)) 
     if (ensureExists) 
      throw new FileNotFoundException("File not Found!"); 
     else return default(T); 

    using (Stream stream = File.Open(dbFile, FileMode.Open)) 
    { 
     if (stream.Length > 0) 
     { 
      BinaryFormatter bFormatter = new BinaryFormatter(); 
      return (T)bFormatter.Deserialize(stream); 
     } 
    } 
} 
-1

我曾在這個醜陋方式做到了這一點:

public static T LoadFromFile<T>(this String fileName, Boolean ensureExists); 

,所以你可以把它叫做

MyType myObject = filename.LoadFromFile<MyType>(true); 

但是最大的缺點是現在每個字符串都會提供這個擴展函數。

+1

任何評論可用於downvote? – Oliver 2011-04-21 14:04:44

+0

不是我downvote。 – 2011-04-21 14:08:48

+1

不是我的失望,但我懷疑它與一個對大多數字符串無效的方法造成字符串實例的污染有關。最好把它做成香草靜態方法。 – Jamiec 2011-04-21 14:16:52