我有以下代码,我试图用来保存和加载手机设置XML文件中的数据(通过PCL中的界面访问来电)
// caller
public void SetStringValue(string name, string val)
{
UserData.SetPropertyValue(this, name, val);
}
// userdata file
namespace PreferencesXML.iOS
{
public static class UserData
{
public static object GetPropertyValue(object data, string propertyName)
{
return data.GetType().GetProperties().SingleOrDefault(pi => pi.Name == propertyName).GetValue(data, null);
}
public static void SetPropertyValue<T>(object data, string propertyName, T value)
{
data.GetType().GetProperties().SingleOrDefault(pi => pi.Name == propertyName).SetValue(data, value);
}
private static string pUserSettingsFile;
private static UserSetting userSetting;
public static UserSetting UserSetting
{
get
{
if (userSetting == null)
{
if (File.Exists(UserSettingsFile))
{
userSetting = Serialiser.XmlDeserializeObject<UserSetting>(UserSettingsFile);
}
else
{
userSetting = new UserSetting();
Serialiser.XmlSerializeObject(userSetting, UserSettingsFile);
}
}
return userSetting;
}
set
{
if (value == null)
{
throw new ArgumentNullException("value is null!");
}
// end if
userSetting = value;
if (File.Exists(UserSettingsFile))
{
File.Delete(UserSettingsFile);
}
Serialiser.XmlSerializeObject(userSetting, UserSettingsFile);
}
}
public static string UserSettingsFile
{
get
{
if (string.IsNullOrEmpty(pUserSettingsFile))
{
pUserSettingsFile = Path.Combine(AppDelegate.Self.ContentDirectory, "UserSettings.xml");
}
return pUserSettingsFile;
}
}
public static string Company
{
get
{
return UserSetting.companyName;
}
set
{
UserSetting settings = UserSetting;
settings.companyName = value;
UserSetting = settings;
}
}
public static double Pi
{
get
{
return UserSetting.pi;
}
set
{
UserSetting settings = UserSetting;
settings.pi = value;
UserSetting = settings;
}
}
public static bool OnOff
{
get
{
return UserSetting.onOff;
}
set
{
UserSetting settings = UserSetting;
settings.onOff = value;
UserSetting = settings;
}
}
}
public class UserSetting
{
public string companyName{ get; set; }
public double pi{ get; set; }
public bool onOff{ get; set; }
}
}
正如你所看到的,它没有做任何令人难以置信的事情。读者部分工作正常,但SetPropertyValue
不断在SingleOrDefault
返回失败。
这取决于调用者扩展方法,它扩展了调用者所在的类而不是UserData类。
由于UserData
类是静态的,我无法创建它的对象实例并将其传递给代替this参数,也不能直接传递UserData或作为通用参数(例如this.SetPropertyValue<UserData>(...)
)。我试图让这个类非静态,这让我更进一步,但并不多。
有没有办法可以使用这段代码在我的UserData类中存储数据?