Метод расширения нерегулярного поведения - PullRequest
0 голосов
/ 21 апреля 2011

Рассмотрим следующее:

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 равно ВСЕГДА пусто.

Есть идеи, почему?

Ответы [ 3 ]

2 голосов
/ 21 апреля 2011

По сути, вы пытаетесь изменить ссылку на 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 голос
/ 21 апреля 2011

LoadFromFile не должен быть методом расширения, это просто обычный статический метод, который возвращает свой результат:

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

Проблема в том, что вы присваиваете параметр экземпляра, и это никак не влияет на переменную, передаваемую этому параметру вне метода. Вы не можете использовать ссылку (ref или out) в параметре экземпляра в методе расширения, который вам необходим для работы вашего кода.

0 голосов
/ 21 апреля 2011

Я сделал это таким безобразным способом:

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

, чтобы вы могли назвать его

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

Но самый большой недостаток в том, что эта функция расширениятеперь будет предлагаться для каждой строки.

...