c# - Get name and value of static class properties using Expression Trees -
i have generic method compares 2 properties, if value different logs changes , saves.
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 {1} {2}",desctiptionattributes[0].description, oldpropertyvalue, newvalue); propertyinfo.setvalue(valuesofallfieldsofobj, newvalue, null); save(); } it works fine when pass properties members of non-static class, when pass static property doesn't work.
saveifchanged(() => _settings.domainname, domainname); // works saveifchanged(() => settings.domainname, domainname); //doesn't work i know how fields/properties of static class, when have class name. don't know how can combine following method.
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()); } thank you.
the problem when try access property expression in var fieldsofobj = (constantexpression)obj.expression;.
memberexpression composed of 2 properties:
expressiongets containing object of field or property.membergets field or property accessed.
in first case (_settings.domainname) property expression gets memberexpression object containing _settings, , property member returns memberinfo pointing domainname.
in second case (settings.domainname), property expression returns null because not accessing property of instance, accessing static property. in code object obj null, , that's when problem comes.
you can see this question details.
to solve issue, can this:
private static void saveifchanged<t>(expression<func<t>> expression, t newvalue) { var expr = (memberexpression)expression.body; object valuesofallfieldsofobj = null; if (expr.expression != null) { var obj = (memberexpression)expr.expression; var fieldsofobj = (constantexpression)obj.expression; 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 {1} {2}", desctiptionattributes[0].description, oldpropertyvalue, newvalue); propertyinfo.setvalue(valuesofallfieldsofobj, newvalue, null); save(); }
Comments
Post a Comment