我有一个从API返回数据的方法,返回的数据在返回对象类型上会有所不同。我该怎么做?
public static dynamic getObjectDataRequest(string ControllerName,string ActionName,dynamic returnObj,object Params)
{
string URL = getAPIURL();
string RequestURL = URL + "/" + ControllerName + "/" + ActionName + "?";
string p = Params.ToString().Replace("{","").Replace("}","").Replace(",", "&");
RequestURL +=p ;
RequestURL = RequestURL.Replace(" ", string.Empty);
HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(RequestURL);
using (WebResponse Response = Request.GetResponse())
{
using (StreamReader Reader = new StreamReader(Response.GetResponseStream()))
{
string soapResult = Reader.ReadToEnd();
JavaScriptSerializer js = new JavaScriptSerializer();
returnObj = js.Deserialize<dynamic>(soapResult);
}
}
return returnObj;
}
这就是它的调用:
var obj = new {
LoginName=UserName,
Password= Password,
ApiLoginName=WebAPIUserName,
ApiPassword= WebAPIPassword,
ExpiryDays=ExpiryDays
};
UserDS oUser = new UserDS();
oUser = WebAPIHelper.getObjectDataRequest("User", "LoginUserState",oUser,obj);
当我使用动态类型时,它会返回错误 :
Cannot implicitly convert type 'System.Collections.Generic.Dictionary<string,object>' to 'UserDS'
答案 0 :(得分:1)
使用泛型。有关详细信息,请参见https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/generic-methods。
在这种情况下,方法签名应该是
public static T GetObjectDataRequest<T>(string ControllerName, string ActionName, object Params);
通用参数T
在这里是适当类型的占位符,将由方法调用者提供。
您可以执行的方法之内:
return js.Deserialize<T>(soapResult);
请注意,我也一并删除了returnObj
,因为您从不将其用作输入,并且可以安全地从using指令中返回。
然后您可以通过以下方式调用该方法:
var oUser = WebAPIHelper.GetObjectDataRequest<UserDS>("User", "LoginUserState", obj);