2011-03-07 32 views
4

我有一个领域一样设置字段值:获取并通过一类具有随机名称传递名称

string vari = "a2de" 

class Foo { 
    public string a2de = "e2" 
} 

我喜欢另外一个变量有此字段的名称

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

喜欢:

getvar(vari) 

setvar(vari) = "e3" 
+0

尝试反射以实现这一目标。 – 2011-03-07 10:43:27

+1

我觉得你有点混淆术语(例如;什么是*变量在另一个变量*?)请提供一个更全面的代码示例,显示你想要做什么。 – 2011-03-07 10:44:23

回答

9

你必须使用反射。

要获得targetObject属性的值:

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

为了得到一个字段的值,它类似于:

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

如果属性/字段不公开或已被继承自基类,则需要提供明确的BindingFlagsGetPropertyGetField

5

可以可能与反射(例如Type.GetField等)做到这一点 - 但通常应该是最后的手段。

您是否考虑过使用Dictionary<string, string>并将“变量名”用作关键字?

+0

如果这篇文章谈论的是__local__变量而不是类型字段,那么这是行不通的。 – bradgonesurfing 2017-01-26 08:35:25

+1

@bradgonesurfing:的确如此。现在,我认为我们会坚持在问题中提供更多细节。 – 2017-01-26 09:00:29

+0

没问题。我只是在这里结束,因为另一个用户在这里提到你的答案,作为权威证明,可以通过反射修改局部变量。 http://stackoverflow.com/q/41867476/158285 – bradgonesurfing 2017-01-26 09:10:39

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. 
    } 
} 
+1

'+ 1'感谢分享!今天保存我的屁股:) – Anne 2012-12-24 02:38:12