在XML-RPC.NET中如何处理直到运行时才知道其类型的返回值?

时间:2012-09-27 19:12:42

标签: c# .net xml-rpc xml-rpc.net

我在C#中使用库XML-RPC.NET在我的服务器上调用XML-RPC方法。当一切正常时,该方法返回一个字符串,但是当发生错误时,它返回一个XmlRpcStruct。

当我获得与我在方法签名中指定的不同的返回类型时,XML-RPC.NET引发异常:

string login(string username, string password);

异常消息:“响应包含字符串期望的结构值”

在XML-RPC.NET的文档中,它说:

“如何指定直到运行时才知道其类型的数据?

有时直到运行时才知道参数,返回值或结构成员的类型。在这种情况下,应使用System.Object数据类型。对于返回值,可以在运行时确定实际类型并进行适当处理。“

所以我将我的返回类型更改为object,现在它可以工作了。但是现在我不知道如何处理返回值。如果它是XmlRpcStruct类型我不想将它转换为我的Error类。否则我把它当作一个字符串。如何将其转换为我的Error类? XML-RPC-NET是否有转换方法或我可以调用的东西?

public interface Proxy : IXmlRpcProxy
{
    [XmlRpcMethod("login")]
    object login(string username, string password);
}

// When the login method fails I get an XmlRpcStruct that has a
// key "status" with a string value. I'd like to cast the returned
// XmlRpcStruct to my Error class. How?
public class Error : XmlRpcStruct
{
    public string status;
}

然后当我调用方法时:

object ret = proxy.login("admin", "1234");
Type t = ret.GetType();

if (t == typeof(XmlRpcStruct))
{
    // This will set err to null even though ret is not null
    // How do I convert it?
    Error err = ret as Error;
}
else
{
    string result = (string)ret;
}

有更简单的方法吗?我可以将我的方法设置为返回类型的字符串然后尝试/ catch方法调用,但后来我丢失了错误中返回的状态消息。

1 个答案:

答案 0 :(得分:0)

如果您的Error类要保存XmlRpcStruct变量怎么办:

public class Error
{
    public string status;
    public XmlRpcStruct xmlstr;
}

然后,您可以将XmlRpcStruct分配给Error对象的变量:

object ret = proxy.login("admin", "1234");
Type t = ret.GetType();

if (t == typeof(XmlRpcStruct))
{
    Error err = new Error();
    err.xmlstr = (XmlRpcStruct)ret;
}
else
{
    string result = (string)ret;
}

您仍然可以通过Error类的变量访问原始的XmlRpcStruct,而不会将其丢失为try语句。可能有更好的方法来实现继承,但这是一个快速修复。