尝试实现一个设置任何字段值的方法并执行其他一些操作。
public void SetValue(string fieldName, object value)
{
GetType().GetField(fieldName).SetValue(this, value);
// some other stuff
}
... example:
SetValue("SomeFloatField", 10.0f);
有没有办法实现这个,所以我不必将字段的名称作为字符串传递?我正在尝试简化它,以便您可以编写类似的内容:
SetValue(someFloatField, 10.0f);
SetValue(someObject, new SomeArbitraryObject());
答案 0 :(得分:1)
听起来你正在寻找表达。
SetValue(c => c.SomeFloatField, 10.0f);
你可以完成这个
private static PropertyInfo GetPropertyInfo<TIn, TOut>(Expression<Func<TIn, TOut>> PropertyExpression)
{
MemberExpression memberExpr;
switch (PropertyExpression.Body.NodeType)
{
case ExpressionType.MemberAccess:
memberExpr = (MemberExpression)PropertyExpression.Body;
break;
case ExpressionType.Convert:
memberExpr = (MemberExpression)((UnaryExpression)PropertyExpression.Body).Operand;
break;
default:
throw new NotSupportedException();
}
var property = (PropertyInfo)memberExpr.Member;
return property;
}
public void SetValue<TOut>(Expression<Func<ThisType, TOut>> PropertyExpression, TOut Value)
{
PropertyInfo info = GetPropertyInfo<TIn, TOut>(PropertyExpression);
info.SetValue(this, Value, null);
}
虽然在第二种方法中,你可能会很好地使它static
并使用类似的TIn
模式而不是直接说明类型。如果没有必要,我不确定这是什么目的。看起来你似乎试图规避任务,这似乎很奇怪。但如果你确实做了那种通用的话,那就更有意义了。