从lambda表达式参数读取和写入模型属性

时间:2016-12-18 12:33:49

标签: c# lambda

我有一个设置服务类,可以从文件加载设置,或者如果它们已经加载,只返回本地设置对象中的值。我想通过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。我做错了什么?

1 个答案:

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