c#polymorphism没有方法重载(对于webmethod)

时间:2011-10-11 09:24:35

标签: c#

好吧,所以我在写了一些重载方法后意识到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地址)是签名。 我明天会给出最接近的答案。我以另外的方式解决了这个问题。

5 个答案:

答案 0 :(得分:4)

您可以使用WebMethodAttribute

[WebMethod(MessageName = "DoPingIPAddress")]
public string DoPing(IPAddress ip) { }

[WebMethod(MessageName = "DoPingString")]
public string DoPing(string ip) { }

但是从客户端来看,您将有两种不同的方法:它是Web服务/ SOAP约束。

Documentation

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

尽量避免使用不必要的模式和模板。