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

时间:2014-11-12 23:26:44

标签: c# reflection

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

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());

1 个答案:

答案 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模式而不是直接说明类型。如果没有必要,我不确定这是什么目的。看起来你似乎试图规避任务,这似乎很奇怪。但如果你确实做了那种通用的话,那就更有意义了。

相关问题