2015-01-21 3 views
0

У меня есть класс, который используется для хранения пользовательских данных в файле. Он хорошо работает, но не может быть легко помещен в библиотеку PCL. Вне PCL все в порядке.Получение значений свойств из статического класса с использованием отражения

Класс выглядит следующим образом

public static class UserData 
{ 
    public static object GetPropertyValue(this object data, string propertyName) 
    { 
     return data.GetType().GetProperties().Single(pi => pi.Name == propertyName).GetValue(data, null); 
    } 

    public static object SetPropertyValue<T>(this object data, string propertyName, T value) 
    { 
     data.GetType().GetProperties().Single(pi => pi.Name == propertyName).SetValue(data, value); 
     return new object(); 
    } 

    private static string pUserSettingsFile; 
    private static UserSettings userSetting; 

    public static bool AccountEnabled 
    { 
     get 
     { 
      return UserSettings.account_enabled; 
     } 

     set 
     { 
      UserSettings settings = UserSettings; 
      settings.account_enabled = value; 
      UserSettings = settings; 
     } 
    } 

    public static UserSettings UserSettings 
    { 
     get 
     { 
      if (userSetting == null) 
      { 
       if (File.Exists(UserSettingsFile)) 
       { 
        userSetting = Serializer.XmlDeserializeObject<UserSettings>(UserSettingsFile); 
       } 
       else 
       { 
        userSetting = new UserSettings(); 
        Serializer.XmlSerializeObject(userSetting, UserSettingsFile); 
       } 
      } 

      return userSetting; 
     } 

     set 
     { 
      if (value == null) 
      { 
       throw new ArgumentNullException("value is null!"); 
      } 

      userSetting = value; 
      if (File.Exists(UserSettingsFile)) 
      { 
       File.Delete(UserSettingsFile); 
      } 

      Serializer.XmlSerializeObject(userSetting, UserSettingsFile); 
     } 
    } 

    public static string UserSettingsFile 
    { 
     get 
     { 
      if (string.IsNullOrEmpty(pUserSettingsFile)) 
      { 
       pUserSettingsFile = Path.Combine(GroupShootDroid.Singleton.ContentDirectory, "UserSettings.xml"); 
      } 

      return pUserSettingsFile; 
     } 
    } 

    #endregion 
} 

public class UserSettings 
{ 
    public bool account_enabled { get; set; } 

    public string address { get; set; } 

    public string country { get; set; } 
} 

Это не ракетостроение, но делает то, что мне нужно это делать.

Что я пытаюсь сделать, это использовать методы Get/SetPropertyValue для возврата или установки каких-либо свойств внутри класса.

В настоящее время, чтобы получить доступ к методам Get/SetPropertyValue Я использую этот

public string GetStringValue(string valToGet) 
    { 
     string rv = (string)UserData.GetPropertyValue(valToGet); 
     return rv; 
    } 

    public void SetStringValue(string name, string val) 
    { 
     UserData.SetPropertyValue(name, val); 
    } 

На компиляции, хотя, метод GetPropertyValue дает ошибку, No overload for method GetPropertyValue takes 1 argument с SetPropertyValue жалуясь, что не перегруженный занимает 2

Я не уверен, что код, который я использую, будет делать то, что мне нужно от него (от того, что я читал здесь, должно быть), но я более озадачен, почему отображаются ошибки.

Есть ли лучший способ сделать то, что я пытаюсь сделать? Приложение представляет собой приложение Xam.Forms, поэтому PCL обращается к классу через интерфейс с помощью инъекции.

+1

Какая часть сообщения об ошибке вы не понимаете? Ваши методы принимают два/три аргумента. – SLaks

ответ

0

Вы определяете метод расширения, вам нужен экземпляр класса называть их:

var o = new Object(); 
string rv = (string)o.GetPropertyValue(valToGet); 
// or, but no sure 
string rv = (string)UserData.GetPropertyValue(o, valToGet); 

или более вероятно, в вашем случае:

public string GetStringValue(string valToGet) 
{ 
    string rv = (string)this.GetPropertyValue(this, valToGet);   
    //or 
    //string rv = (string)UserData.GetPropertyValue(this, valToGet);   
    return rv; 
} 
0

Я думаю, вы получаете путать между класс UserData и класс объекта. Ваши методы расширения расширяют объект.

Смежные вопросы