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

C# 用于设置任何公共字段值的方法,c#,reflection,C#,Reflection,尝试实现一个方法,该方法设置任何字段的值并执行其他操作 public void SetValue(string fieldName, object value) { GetType().GetField(fieldName).SetValue(this, value); // some other stuff } ... example: SetValue("SomeFloatField", 10.0f); 有没有一种方法可以实现这一点,这样我就不必将字段的名称作为字符串

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

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);
}
private static PropertyInfo GetPropertyInfo(Expression-PropertyExpression)
{
MemberExpressionMemberExpr;
开关(PropertyExpression.Body.NodeType)
{
case ExpressionType.MemberAccess:
memberExpr=(MemberExpression)PropertyExpression.Body;
打破
大小写表达式类型。转换:
memberExpr=(MemberExpression)((UnaryExpression)PropertyExpression.Body)。操作数;
打破
违约:
抛出新的NotSupportedException();
}
var property=(PropertyInfo)memberExpr.Member;
归还财产;
}
public void SetValue(表达式属性Expression,TOut值)
{
PropertyInfo info=GetPropertyInfo(PropertyExpression);
info.SetValue(this,Value,null);
}

尽管在第二种方法中,您最好将其设置为
static
,并使用类似的
TIn
模式,而不是直接声明类型。如果没有必要的话,我不确定这一切的目的是什么。你们似乎在试图规避这个任务,这看起来很奇怪。但是如果你真的做了一般化,那就更有意义了。

为什么不在那一点上做一个作业呢?因为“其他的东西”:),细节不是真正相关的,而是做一些更改跟踪和字段绑定系统。@Dmitry这是有目的的。正如我在下面一段中所说的,这可能是一种更有用的方法,但最初的问题是关于设置
上的值。如果需要一个
TIn
,我们需要接受该TIn的一个实例来设置其值。我随意选择了
这个类型
,因为我们不知道
这个
的类型。谢谢!结果是:public void SetValue(表达式字段,对象值){((field.Body作为MemberExpression.Member作为FieldInfo.SetValue)(this,value);}