类型约束多重可能性
本文关键字:可能性 约束 类型 | 更新日期: 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
中,然后将调用委托给实际的方法