通过传递名称来获取和设置字段值

时间:2011-03-07 10:41:22

标签: c# reflection field

我在类中有一个字段,其随机名称如下:

class Foo {
    public string a2de = "e2"
}

我在另一个变量中有这个字段的名称,如:

string vari = "a2de"

我可以使用a2de的值来获取或设置字段vari的值吗?

像:

getvar(vari)

setvar(vari) = "e3"

3 个答案:

答案 0 :(得分:9)

你必须使用反射。

要在targetObject上获取属性的值:

var value = targetObject.GetType().GetProperty(vari).GetValue(targetObject, null);

要获得字段的值,它是相似的:

var value = targetObject.GetType().GetField(vari).GetValue(targetObject, null);

如果属性/字段不是公共的或已从基类继承,则需要向BindingFlagsGetProperty提供明确的GetField

答案 1 :(得分:5)

可以使用反射(例如Type.GetField等)进行 - 但这通常应该是最后的手段。

您是否考虑过使用Dictionary<string, string>并使用“变量名称”作为密钥?

答案 2 :(得分:1)

您必须使用Reflection按名称访问变量。像这样:

class Foo
{
    int namedField = 1;
    string vari = "namedField"

    void AccessField()
    {
        int val = (int) GetType().InvokeMember(vari,
        BindingFlags.Instance | BindingFlags.NonPublic |
        BindingFlags.GetField, null, this, null);
        // now you should have 1 in val.
    }
}