将动态对象类型传递给方法

时间:2019-02-12 07:00:22

标签: c#

我有一个从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'

1 个答案:

答案 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);