Pass a dynamic object type to method

Refresh

February 2019

Views

34 time

0

I have a method that return data from API ,the returned data will be differ upon the return object type.How can I do that?

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;
    }

and that's the call of it:

var obj = new {
            LoginName=UserName,
            Password= Password,
            ApiLoginName=WebAPIUserName,
            ApiPassword= WebAPIPassword,
            ExpiryDays=ExpiryDays
        };
UserDS oUser = new UserDS();
oUser = WebAPIHelper.getObjectDataRequest("User", "LoginUserState",oUser,obj);

when I use the dynamic type it's return an error :

  Cannot implicitly convert type 'System.Collections.Generic.Dictionary<string,object>' to 'UserDS'

2 answers

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полностью, потому что вы никогда не использовать его в качестве входных данных , и вы можете просто спокойно вернуться изнутри с помощью директивы.

После этого вы можете вызвать метод с помощью:

var oUser = WebAPIHelper.GetObjectDataRequest<UserDS>("User", "LoginUserState", obj);
-1

Ваш метод может возвращать JSON в виде строки. Клиенты этого метода уже можно сделать преобразование, например, с помощью Newtonsoft.Json.

var obj = JsonConvert.DeserializeObject(jsonString);