0

有没有办法在类型可以是一种类型或另一种类型的情况下放置类型约束?

类似的东西:

    public void ParseXML<T>(T param) where T : XElement or T : string

编辑:

根据你的回答(感谢那些),我想我会走这条路:

public void ParseXML(XElement param)
{
    this.parseXML(param)
}

public void ParseXML(string param)
{
    this.parseXML(param)
}

public void parseXML(object param)
{
    var paramXElement = param as XElement;
    var paramString = param as paramString;
    ...
    <common proccess on param>
    ...
    <specific process on paramXElement> [if not null]
    <specific process on paramString> [if not null]
    ...

}
4

5 回答 5

2

这是不可能的。您将如何区分函数内部的一种类型或另一种类型?即使那样,您也可能必须进行类型检查和专门化,这违背了泛型方法的目的。

如果您有两种不同的可能性,那么提供两个专门的重载将是最容易的:

public void ParseXml(string val)
public void ParseXml(XElement element)

如果有意义的话,也可能是任何其他类型的通用版本。

于 2013-06-05T08:23:57.970 回答
2

我只会创建两个重载:

public void ParseXML(XElement param);
public void ParseXML(string param);

我不明白T这里的意义。

如果 string 方法应该在字符串中获取 XML,我只会将该方法包装在 an 中XElement并调用另一个,这样您就不会重复代码。

于 2013-06-05T08:27:53.853 回答
1

你真的不能这样做。

我的建议是XElement仅限制,然后为explicit该类提供一个运算符,获取更多信息string,请参阅此链接

于 2013-06-05T08:24:31.707 回答
1

不,你不能。你有两个选择:

1) 编写 的两个重载ParseXML(),每个支持的类型一个。它不再是通用的。

2)没有约束,但在运行时测试类型。在这种情况下,您使用object而不是泛型:

public void ParseXML(object param)
{
    var asString = param as string;

    if (asString != null)
    {
        // Do something with string.
        return;
    }

    var asXElement = param as XElement;

    if (asXElement != null)
    {
        // Do something with XElement.
        return;
    }

    // Error handling.
}

显然第一种方法更好,因为它避免了运行时错误的可能性。

于 2013-06-05T08:24:50.107 回答
1

不,你不能。

您应该创建一个接受字符串的重载,将其包装在XElement然后将调用委托给实际方法

于 2013-06-05T08:25:05.017 回答