好吧,所以我在写了一些重载方法后意识到webmethods不能超载(通过实现我的意思是VS扔了一个paddy并且不允许我更新服务引用)。我试图解决这个问题:
public string DoPing<T>(T IP)
{
if (typeof(T) == typeof(string))
{
return DoPingString(IP);
}
if (typeof(T) == typeof(IPAddress))
{
return DoPingIP(IP);
}
throw new Exception("Programmer Error");
}
但是当我调用相应的(重命名的)方法时,我得到的是无法从T转换为字符串/ Ipadress错误。 有人能解释为什么它不起作用,可能要么修复它还是给我一个替代解决方案? 提前谢谢。
编辑:好点,泛型可能是矫枉过正(我尝试了另一种解决方案并在尝试之前失败了)。 DoPingString(字符串字符串)和DoPingIP(IPAdress地址)是签名。 我明天会给出最接近的答案。我以另外的方式解决了这个问题。
答案 0 :(得分:4)
您可以使用WebMethodAttribute
:
[WebMethod(MessageName = "DoPingIPAddress")]
public string DoPing(IPAddress ip) { }
[WebMethod(MessageName = "DoPingString")]
public string DoPing(string ip) { }
但是从客户端来看,您将有两种不同的方法:它是Web服务/ SOAP约束。
答案 1 :(得分:1)
尝试使用Convert.ChangeType
方法,然后照常投射:
if (typeof(T) == typeof(string))
{
return DoPingString((string)Convert.ChangeType(IP, typeof(string)));
}
if (typeof(T) == typeof(IPAddress))
{
return DoPingIP((IPAddress)Convert.ChangeType(IP, typeof(IPAddress)));
}
答案 2 :(得分:1)
您没有按照预期的方式使用泛型。编译器不知道T是什么类型,因此它不会让你隐式或显式地转换为String或IPAddress。 这是一个有效的版本:
public string DoPing<T>(T IP)
{
if (typeof(T) == typeof(string))
{
return DoPingString((String)Convert.ChangeType(IP, typeof(String)));
}
if (typeof(T) == typeof(IPAddress))
{
return DoPingIP((IPAddress)Convert.ChangeType(IP, typeof(IPAddress)));
}
throw new Exception("Programmer Error");
}
但是,由于您使用的泛型没有约束,因此您无法从通用实现中获益。为什么不拿一个物体?
public string DoPing(Object IP)
{
if (IP.GetType() == typeof(string))
{
return DoPingString((String)IP);
}
if (IP.GetType() == typeof(IPAddress))
{
return DoPingIP((IPAddress)IP);
}
throw new Exception("Programmer Error");
}
当然,更简单,更简单的方法就是简单地重载你的功能,即:
public string DoPing(string IP)
{
return DoPingString(IP);
}
public string DoPing(IPAddress IP)
{
return DoPingIP(IP);
}
答案 3 :(得分:1)
听起来你想要在WCF中使用KnownTypeAttribute
。但看到你不能在这里使用它,你肯定只想要一种方法,那么我认为唯一的方法就是提供两个参数。只需添加一些验证来检查空值并将它们传递给您的私有帮助器方法。
[WebMethod]
public string DoPing(string ipString, IPAddress ipAdress)
{
if(ipString != null)
{
DoPing(ipString);
}
if(ipAdress != null)
{
DoPing(ipAdress);
}
}
答案 4 :(得分:-1)
我最好这样做:
public string DoPing(IPAddress ip)
{
...logic...
}
public string DoPing(String ip)
{
...logic...
}
尽量避免使用不必要的模式和模板。