2

全部——我的一个类中有这两种方法:

public static void DeSerializeFromXml(out cDBData db, string pathToXML)
{
    using (XmlTextReader reader = new XmlTextReader(pathToXML))
    {
        XmlSerializer ser = new XmlSerializer(typeof(cDBData));
        db = (cDBData)ser.Deserialize(reader);
    }
}

public static void DeSerializeFromXml(out cDatabases db, string pathToXML)
{
    using (XmlTextReader reader = new XmlTextReader(pathToXML))
    {
        XmlSerializer ser = new XmlSerializer(typeof(cDatabases));
        db = (cDatabases)ser.Deserialize(reader);
    }
}

他们工作正常,但我想知道为什么我不能根据方法的返回类型创建方法重载。我以为我读到这在某处是可能的,但我显然错了,因为它不起作用:

public static cDBData DeSerializeFromXml(string pathToXML)
{
    cDBData db;

    using (XmlTextReader reader = new XmlTextReader(pathToXML))
    {
        XmlSerializer ser = new XmlSerializer(typeof(cDBData));
        db = (cDBData)ser.Deserialize(reader);
    }
    return db;
}

public static cDatabases DeSerializeFromXml(string pathToXML)
{
    cDatabases db;

    using (XmlTextReader reader = new XmlTextReader(pathToXML))
    {
        XmlSerializer ser = new XmlSerializer(typeof(cDatabases));
        db = (cDatabases)ser.Deserialize(reader);
    }
    return db;
}

感谢您的周到回复

感谢 dlev,这是最终的解决方案

    public static T DeSerializeFromXml<T>(string pathToXML)
    {
        T db;

        using (XmlTextReader reader = new XmlTextReader(pathToXML))
        {
            XmlSerializer ser = new XmlSerializer(typeof(T));
            db = (T)ser.Deserialize(reader);
        }
        return db;
    }

    public static void SerializeToXml<T>(T db, string pathToXML)
    {
        using (var fileStream = new FileStream(pathToXML, FileMode.Create))
        {
            var ser = new XmlSerializer(typeof(T));
            ser.Serialize(fileStream, db);
        }
    }

我想在搜查警察关闭这个问题之前把这些贴出来。

4

3 回答 3

6

你不能这样做,因为 C# 根本不支持这种重载。您可以通过使方法泛型并返回泛型参数类型来实现类似的效果:

public static T DeSerializeFromXml<T>(string pathToXML)
{
    T db;

    using (XmlTextReader reader = new XmlTextReader(pathToXML))
    {
        XmlSerializer ser = new XmlSerializer(typeof(T));
        db = (T)ser.Deserialize(reader);
    }
    return db;
}

然后,您可以像这样调用函数:

DeSerializeFromXml<cDatabases>(pathToXml);

虽然这不是您想要的,但它确实具有只需要一个方法的好处。

于 2012-06-26T21:41:46.403 回答
3

我想知道为什么我不能根据方法的返回类型创建方法重载。

这根本不可能。在重载决议期间不考虑返回类型,并且该语言只是禁止尝试像这样重载。从 C# 4 规范的第 3.6 节:

方法的签名由方法的名称、类型参数的数量以及每个形式参数的类型和种类(值、引用或输出)组成,按从左到右的顺序考虑。出于这些目的,出现在形参类型中的方法的任何类型参数都不是通过其名称来标识的,而是通过它在方法的类型参数列表中的序号位置来标识的。方法的签名特别不包括返回类型、可以为最右边的参数指定的 params 修饰符,也不包括可选的类型参数约束。

请注意,此处包括返回类型。然后我们有:

签名是类、结构和接口中成员重载的启用机制:

  • 方法的重载允许类、结构或接口声明多个具有相同名称的方法,前提是它们的签名在该类、结构或接口中是唯一的。

就这样做的动机而言,如果表达式的类型取决于表达式的使用方式,那会使生活变得非常复杂。对于某些表达式(例如和 lambda 表达式)这种情况,null但对于方法调用等则不然。你最终可能会遇到一些非常奇怪的情况:

public void Foo(int x) {}
public void Foo(long y) {}

public int Bar() {}
public long Bar() {}

Foo(Bar()); // What would this call?
于 2012-06-26T21:41:30.837 回答
0

你为什么不只返回一个通用对象?在这种情况下,您可能不需要超载。

于 2012-06-26T21:43:02.703 回答