我有一個比較2個屬性的通用方法,如果值不同,它會記錄更改和保存。使用表達式樹獲取靜態類屬性的名稱和值
private void SaveIfChanged<T>(Expression<Func<T>> expression, T newValue)
{
var expr = (MemberExpression)expression.Body;
var obj = (MemberExpression)expr.Expression;
var fieldsOfObj = (ConstantExpression)obj.Expression;
var valuesOfAllFieldsOfObj = ((FieldInfo)obj.Member).GetValue(fieldsOfObj.Value);
var propertyInfo = ((PropertyInfo)expr.Member);
var oldPropertyValue = propertyInfo.GetValue(valuesOfAllFieldsOfObj, null);
if (oldPropertyValue.Equals(newValue)) return;
var desctiptionAttributes = (DescriptionAttribute[])propertyInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
Log("{0} changed from {1} to {2}",desctiptionAttributes[0].Description, oldPropertyValue, newValue);
propertyInfo.SetValue(valuesOfAllFieldsOfObj, newValue, null);
Save();
}
它工作正常,當我傳遞非靜態類的成員屬性,但是當我傳遞一個靜態屬性,然後它不起作用。
SaveIfChanged(() => _settings.DomainName, DomainName); // Works
SaveIfChanged(() => Settings.DomainName, DomainName); //Doesn't work
我也知道如何獲得靜態類的字段/屬性,但只有當我有類名。我只是不知道如何將以下內容與我的方法相結合。
Type s= typeof(Settings);
FieldInfo[] fields = t.GetFields(BindingFlags.Static | BindingFlags.Public);
foreach (FieldInfo fi in fields)
{
Console.WriteLine(fi.Name);
Console.WriteLine(fi.GetValue(null).ToString());
}
謝謝。
完美,這就是我所困惑的。 – Marshal