C# 通过传递名称获取并设置字段值
我在一个类中有一个随机名称的字段,如:C# 通过传递名称获取并设置字段值,c#,reflection,field,C#,Reflection,Field,我在一个类中有一个随机名称的字段,如: class Foo { public string a2de = "e2" } 我在另一个变量中有此字段的名称,如: string vari = "a2de" 我可以使用vari的值获取或设置字段a2de的值吗 比如: 或 你必须使用反射 要获取targetObject上的属性值: var value = targetObject.GetType().GetProperty(vari).GetValue(targetObject, null);
class Foo {
public string a2de = "e2"
}
我在另一个变量中有此字段的名称,如:
string vari = "a2de"
我可以使用vari
的值获取或设置字段a2de
的值吗
比如:
或
你必须使用反射 要获取
targetObject
上的属性值:
var value = targetObject.GetType().GetProperty(vari).GetValue(targetObject, null);
要获取字段的值,它类似于:
var value = targetObject.GetType().GetField(vari).GetValue(targetObject, null);
如果属性/字段不是公共的,或者是从基类继承的,则需要向GetProperty
或GetField
提供显式的BindingFlags
,或者GetField
,您可以通过反射(例如Type.GetField
等)来实现,但这通常是最后的手段
您是否考虑过使用
字典
并使用“变量名”作为键?您必须使用反射按名称访问变量。像这样:
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
感谢分享!今天救了我一命:)如果帖子讨论的是局部变量而不是类型字段,那么这就行不通了。@bradgonesurfing:True。这些天来,我想我们会坚持从问题的更多细节开始。没问题。我之所以在这里结束,是因为另一位用户在这里引用了您的答案,作为可以通过反射修改局部变量的权威证据。
var value = targetObject.GetType().GetField(vari).GetValue(targetObject, null);
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.
}
}