用于设置任何公共字段的值的方法



尝试实现一个方法,该方法可以设置任何字段的值并执行其他操作。

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模式,而不是直接声明类型。如果没有必要的话,我不确定这样做的目的是什么。你似乎在试图规避任务,这似乎很奇怪。但如果你真的把它变成通用的,它会更有意义。

最新更新