类型约束多种可能性?

时间:2013-06-05 08:20:17

标签: c# types constraints

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

类似的东西:

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

}

5 个答案:

答案 0 :(得分:2)

这是不可能的。您如何区分功能中的一种类型或另一种类型? 即便如此,你可能不得不进行类型检查和专门化,这违背了泛型方法的目的。

如果您有两种不同的可能性,那么最简单的方法就是提供两种特殊的重载:

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

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

答案 1 :(得分:2)

我只会创建两个重载:

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

我在这里看不到T的观点。

如果字符串方法应该在字符串中使用XML,我只是将该方法包装在XElement中并调用另一个,这样就不会复制代码。< / p>

答案 2 :(得分:1)

你真的不能这样做。

我建议仅限XElement,然后为该explicit类提供string运算符,有关详细信息,请参阅this link

答案 3 :(得分: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.
}

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

答案 4 :(得分:1)

不,你不能。

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