C# 不规则行为的扩展方法

C# 不规则行为的扩展方法,c#,extension-methods,C#,Extension Methods,考虑以下几点: 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, File

考虑以下几点:

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);
            }
        }
    }
}
lstserver始终为空


你知道为什么吗?

LoadFromFile不应该是一个扩展方法,而应该是一个返回结果的普通静态方法:

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

问题是您分配给实例参数,而这对在方法外部传递给该参数的变量没有任何影响。您不能在扩展方法的实例参数中使用by reference(
ref
out
),这是使代码正常工作所需要的。

您实际上是在尝试更改
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);
        }
    }
}
public static T LoadFromFile(字符串文件名,布尔值ensureExists)
{
字符串dbFile=Path.Combine(Application.StartupPath,文件名);
如果(!File.Exists(dbFile))
如果(确保存在)
抛出新的FileNotFoundException(“找不到文件!”);
否则返回默认值(T);
使用(Stream=File.Open(dbFile,FileMode.Open))
{
如果(stream.Length>0)
{
BinaryFormatter bFormatter=新的BinaryFormatter();
返回(T)bFormatter.反序列化(流);
}
}
}
我是这样做的:

public static T LoadFromFile(此字符串文件名,布尔值ensureExists);
所以你可以称之为

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

但最大的缺点是,现在将为每个字符串提供此扩展函数。

不是我的下一票,但我怀疑它与使用对大多数字符串无效的方法对字符串实例进行辩论有关。最好把它变成一个普通的静态方法。@Jamiec:是的,我不认为这不是一个好方法,所以我称之为丑陋的方法。也许我说得更清楚一点。这并不难看,这是一个坏习惯。丑八怪应该使用单字母变量和非标准命名约定。
public static T LoadFromFile<T>(this String fileName, Boolean ensureExists);
MyType myObject = filename.LoadFromFile<MyType>(true);