2016-12-18 57 views
2

我有一个设置服务类,它从文件加载设置,或者如果它们已经加载,只是从本地设置对象返回值。我想通过set访问设置并使用lambda表达式参数获取方法。从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总是空。我究竟做错了什么?

+1

好,'.Member'可能是'PropertyInfo'或'FieldInfo'。 –

+1

我试过你的代码,并且它工作正常,如果AppStartUpTimes是一个属性。它是Settings类的一个属性还是一个字段? –

+0

@MaksimSimkin确实是这个问题。这不是一个财产,而是一个领域。现在,它的工作,非常感谢! – Alpine13

回答

1

你的代码是好的,如果你设置的属性的作品,但如果您尝试投FieldInfoPropertyInfo,如果你在你的设置类两个字段和属性,你可以改变你的代码,这样你会得到一个空:

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

如果刚领域,你应该只改变投:

private static async Task SetSetting<T>(Expression<Func<Settings, T>> property, T newValue) 
{ 
     var fieldInfo = (property.Body as MemberExpression).Member as FieldInfo; 
     fieldInfo.SetValue(_settings, newValue); 
}