C# (XF)只能从一个类调用API值

C# (XF)只能从一个类调用API值,c#,json,api,xamarin,xamarin.forms,C#,Json,Api,Xamarin,Xamarin.forms,所以我得到了这些类(JsonData只是一些类,其中包含API中Json值的getter和setter): GetSetJsonData: class GetSetJsonData { HttpClient client; #region SuccesLogin JsonData.SuccesLogin.RootObject succesLogin; JsonData.SuccesLogin.Session session; JsonData.Succe

所以我得到了这些类(JsonData只是一些类,其中包含API中Json值的getter和setter):

GetSetJsonData:

 class GetSetJsonData
{
    HttpClient client;
    #region SuccesLogin
    JsonData.SuccesLogin.RootObject succesLogin;
    JsonData.SuccesLogin.Session session;
    JsonData.SuccesLogin.Data2 data2;
    JsonData.SuccesLogin test;
    #endregion
    #region CompanyData
    JsonData.CompanyData.RootObject companyDataMatchPage;
    JsonData.CompanyData.RootObject companyDataMyNetwork;
    JsonData.CompanyData.RootObject companyDataAllCompanies;
    #endregion

    //uristrings for connecting
    string uriLoginString = "url";
    string uriGetCompanies = "url";

    public string sessionString { get; set; }

    public bool MakeConnection(string email, string password)
    {
        succesLogin = new JsonData.SuccesLogin.RootObject();
        session = new JsonData.SuccesLogin.Session();
        data2 = new JsonData.SuccesLogin.Data2();
        var userdata = new JsonData.UserLogin.Login()
        {
            userdata = new JsonData.UserLogin.Userdata()
            {
                user_email = email,
                user_password = password
            }
        };
        var content = new StringContent(JsonConvert.SerializeObject(userdata), Encoding.UTF8, "application/json");
        client = new HttpClient();
        var response = client.PostAsync(uriLoginString, content).Result;
        var responseString = response.Content.ReadAsStringAsync().Result;
        succesLogin = JsonConvert.DeserializeObject<JsonData.SuccesLogin.RootObject>(responseString);
        if (succesLogin.success == null)
        {
            return false;
        }
        else
        {
            session = succesLogin.success.data.session;
            sessionString = JsonConvert.SerializeObject(session);
            data2 = succesLogin.success.data.data;
            return true;
        }

        //implement failure system
    }

    //testing only
    public void Test()
    {
        sessionString = JsonConvert.SerializeObject(session);

    }
}

当我从LoginPage调用MakeConnection时,我在GetSetJsonData类中获得了数据,一点问题也没有。现在,当我从LoginPage调用Test()或sessionString时,它仍然有效,但是当我尝试从任何其他类调用它时,由于某种原因,它只显示空值,即使我保存了它们。我似乎无法让它工作,我有点放弃了希望,有什么办法可以做到这一点吗?

您正在LoginPage和其他页面中创建GetSetJsonData类作为一个新实例。在这种情况下,GetSetJsonData类以及类内的sessionString将仅在LoginPage内可用

如果要使sessionString在所有位置都可用,可以有几个选项:

  • 将GetSetJsonData类设置为静态类
    公共静态类GetSetJsonData
  • 将GetSetJsonData类设为单例类。有关更多详细信息,请参阅

    public class Singleton
    {
        private static Singleton instance;
    
        private Singleton() {}
    
        public static Singleton Instance
        {
            get 
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
                return instance;
            }
        }
    }
    
  • 将GetSetJsonData实例作为公共属性放在其他静态类或singleton类中。例如:应用程序内类

    public partial class App : Application
    {
        public GetSetJsonData GetSetJsonDataInstance { get; private set; }
    
        public App()
        {
            InitializeComponent();
            GetSetJsonDataInstance = new GetSetJsonData();
        }
        ...
    }
    
    // Then you can access to the instance using:
    ((App)Application.Current).GetSetJsonDataInstance
    

  • 如果看不到更多的代码,这是不可能的,但我怀疑在您的另一个页面中,您正在创建GetSetJsonData类的新实例,但希望它与同一类的其他实例具有相同的数据。这不是OOD的工作方式。如果你想共享一个类的一个实例,考虑一个单独的或静态的类。@杰森,这是一个单独的或静态的GETStJSONSORDATA类吗?@杰森,是的,我在其中创建了一个新类,它实际上是一个想法,但不知道如何修复它。
    public partial class App : Application
    {
        public GetSetJsonData GetSetJsonDataInstance { get; private set; }
    
        public App()
        {
            InitializeComponent();
            GetSetJsonDataInstance = new GetSetJsonData();
        }
        ...
    }
    
    // Then you can access to the instance using:
    ((App)Application.Current).GetSetJsonDataInstance