C# 从lambda表达式参数读取和写入模型属性
我有一个设置服务类,可以从文件加载设置,或者如果已经加载了设置,则只返回本地设置对象的值。我想通过带有lambda表达式参数的set和get方法访问设置 我定义了一个私有GetSettings方法: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
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);
}