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

C# 从lambda表达式参数读取和写入模型属性,c#,lambda,C#,Lambda,我有一个设置服务类,可以从文件加载设置,或者如果已经加载了设置,则只返回本地设置对象的值。我想通过带有lambda表达式参数的set和get方法访问设置 我定义了一个私有GetSettings方法: private async Task<T> GetSetting<T>(Func<Settings, T> property, T defaultValue) { if (_settings != null) return property(_settin

我有一个设置服务类,可以从文件加载设置,或者如果已经加载了设置,则只返回本地设置对象的值。我想通过带有lambda表达式参数的set和get方法访问设置

我定义了一个私有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;
}
对于我尝试过的设置方法:

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);
}
专用异步任务集设置(表达式属性,T newValue)
{
var propertyInfo=(property.Body作为MemberExpression.Member作为propertyInfo;
propertyInfo.SetValue(\u设置,newValue);
}

但是propertyInfo总是空的。我做错了什么?

如果您设置了属性,您的代码很好并且可以工作,但是如果您尝试将
FieldInfo
强制转换为
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);
    }
}
私有静态异步任务集设置(表达式属性,T newValue)
{
var propertyInfo=(property.Body作为MemberExpression.Member作为propertyInfo;
if(propertyInfo!=null)
{
propertyInfo.SetValue(\u设置,newValue);
}
其他的
{
var fieldInfo=(property.Body作为MemberExpression)。成员作为fieldInfo;
fieldInfo.SetValue(_设置,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);
}
私有静态异步任务集设置(表达式属性,T newValue)
{
var fieldInfo=(property.Body作为MemberExpression)。成员作为fieldInfo;
fieldInfo.SetValue(_设置,newValue);
}

嗯,
成员可以是
PropertyInfo
FieldInfo
。我已经尝试过你的代码,如果AppStartUpTimes是一个属性,它工作正常。它是设置类的属性还是字段?@MaksimSimkin这确实是个问题。这不是一个财产,而是一块田地。现在它工作了,非常感谢!
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);
}