2015-09-25 43 views
0

我有稱爲ctdl_User,ctdl_Device和ctdl_Options的類。取決於參數的方法的不同變體

我有一個函數,使用二進制格式化程序保存ctdl_User對象,另一個加載它們。但是這些函數特別期望獲取並返回User對象,並且我想使用此函數來加載我的其他對象。

我該如何着手改變函數的類型?這裏是保存和加載功能...

public ctdl_User Load() 
    { 
     ctdl_User loadedUsr = new ctdl_User(); 
     string DataFileSave = Settings.Default.savePath + "\\testuserfile.dat"; 
     FileStream dataStr = new FileStream(DataFileSave, FileMode.Open); 
     BinaryFormatter frmtr = new BinaryFormatter(); 
     loadedUsr = (ctdl_User) frmtr.Deserialize(dataStr); 
     dataStr.Close(); 
     return loadedUsr; 
    } 

public static void Save(ctdl_User usr) 
    { 
     string DataFileSave = Settings.Default.savePath + "\\testuserfile.dat"; 
      File.Delete(DataFileSave); 
      FileStream dataStr = new FileStream(DataFileSave, FileMode.Create); 
      BinaryFormatter frmtr = new BinaryFormatter(); 
      frmtr.Serialize(dataStr, usr); 
      dataStr.Close(); 

    } 

回答

0

下面演示使用泛型在C#的方法:

public static T Load<T>() where T : new() 
{ 
    T loadedUsr = new T(); 
    string DataFileSave = Settings.Default.savePath + "\\testuserfile.dat"; 
    FileStream dataStr = new FileStream(DataFileSave, FileMode.Open); 
    BinaryFormatter frmtr = new BinaryFormatter(); 
    loadedUsr = (T) frmtr.Deserialize(dataStr); 
    dataStr.Close(); 
    return loadedUsr; 
} 

public static void Save<T>(T usr) 
{ 
    string DataFileSave = Settings.Default.savePath + "\\testuserfile.dat"; 
    File.Delete(DataFileSave); 
    FileStream dataStr = new FileStream(DataFileSave, FileMode.Create); 
    BinaryFormatter frmtr = new BinaryFormatter(); 
    frmtr.Serialize(dataStr, usr); 
    dataStr.Close(); 
} 

注意在Load()方法中的用途new() constraint的。 下面是調用這些方法的一個例子:

public static void Main(string[] args) 
{ 
    ctdl_User user = new ctdl_User(); 
    user.name = "Alice"; 
    Save<ctdl_User>(user); 
    ctdl_User user2 = Load<ctdl_User>(); 
    Console.WriteLine(user2.name); 

    ctdl_Device device = new ctdl_Device(); 
    device.type = "printer"; 
    Save<ctdl_Device>(device); 
    ctdl_Device device2 = Load<ctdl_Device>(); 
    Console.WriteLine(device2.type); 
} 

爲了完整起見,這裏是我用來測試這個代碼的stub類:

[Serializable()] 
class ctdl_User 
{ 
    public string name; 
} 

[Serializable()] 
class ctdl_Device 
{ 
    public string type; 
} 

編輯:添加代碼Main(),節約和加載裝置,以及用戶。

+0

完美!非常感謝。 – Astyy

0

假設這是Java中,你可以只重載方法下面這個方案:

public static void Load(Type1 obj) 
    { 
     //do sth with object of type Type1 
    } 

    public static void Load(Type2 obj) 
    { 
     //do sth with object of type Type2 
    } 

    //...etc 

此外,如果有可用於它的通用代碼另一類型的對象,你可以exrtact此代碼以一個梅索德可治療重載方法作爲門面

private static void doLoad(Object obj) 
    { 
     //the common code 
    } 

    public static void Load(Type1 obj) 
    { 
     doLoad(obj); // or something else... 
    } 

    public static void Load(Type2 obj) 
    { 
     doLoad(obj); // or something else... 
    } 

    //...etc 

你可以閱讀更多關於overloading methods in Java here

相關問題