我有一个设置服务类,可以从文件加载设置,或者如果它们已经加载,只返回本地设置对象中的值。我想通过set和get方法使用lambda表达式参数访问设置。
我定义了一个私有的GetSettings方法:
private async Task<T> GetSetting<T>(Func<Settings, T> property, T defaultValue)
{
if (_settings != null) return property(_settings);
await TryGetSettingsFromFile();
return _settings != null ? property(_settings) : defaultValue;
}
所以我可以得到这样的值:
public async Task<int> GetAppStartUpTimes()
{
return await GetSetting(s => s.AppStartUpTimes, 0);
}
这可以按预期工作,但我无法弄清楚如何制作SetSetting方法。我想做这样的事情:
public async Task SetAppStartUpTimes(int value)
{
await SetSetting(s => s.AppStartUpTimes, value);
}
对于我尝试过的SetSetting方法:
private async Task SetSetting<T>(Expression<Func<Settings, T>> property, T newValue)
{
var propertyInfo = (property.Body as MemberExpression).Member as PropertyInfo;
propertyInfo.SetValue(_settings, newValue);
}
但propertyInfo始终为null。我做错了什么?
答案 0 :(得分:1)
您的代码很好,如果您设置了属性,则可以使用,但如果您尝试将Shift
转换为FieldInfo
,则会获得null,如果您的设置类中同时包含字段和属性以这种方式更改您的代码:
PropertyInfo
如果您只有字段,则只应更改强制转换:
private static async Task SetSetting<T>(Expression<Func<Settings, T>> property, T newValue)
{
var propertyInfo = (property.Body as MemberExpression).Member as PropertyInfo;
if (propertyInfo != null)
{
propertyInfo.SetValue(_settings, newValue);
}
else
{
var fieldInfo = (property.Body as MemberExpression).Member as FieldInfo;
fieldInfo.SetValue(_settings, newValue);
}
}