类型约束多重可能性

本文关键字:可能性 约束 类型 | 更新日期: 2023-09-27 18:17:03

是否有一种方法可以放置类型约束,其中类型可以是一种类型或另一种类型?

像这样:

    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]
    ...
}

类型约束多重可能性

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

如果有两种不同的可能性,最简单的方法是提供两个专门的重载:

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

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

我将创建两个重载:

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

我不明白T在这里的意义。

如果字符串方法应该以字符串的形式接受XML,我只会使该方法将其包装在XElement中并调用另一个方法,这样您就不会重复代码。

你真的不能这么做。

我建议的是仅由XElement约束,然后为该类提供explicit操作符,使用string,请参阅此链接以获取更多信息。

不行。您有两个选项:

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.
}

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

不行。

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