Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过传递名称获取并设置字段值_C#_Reflection_Field - Fatal编程技术网

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