尝试实现一个方法,该方法可以设置任何字段的值并执行其他操作。
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());
听起来像是在寻找一个表达式。
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
模式,而不是直接声明类型。如果没有必要的话,我不确定这样做的目的是什么。你似乎在试图规避任务,这似乎很奇怪。但如果你真的把它变成通用的,它会更有意义。