Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.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 - Fatal编程技术网

C# 如何从类中获取私有静态字段的值?

C# 如何从类中获取私有静态字段的值?,c#,reflection,C#,Reflection,是否有任何方法可以使用反射从已知类获取私有静态字段的值?是 Type type = typeof(TheClass); FieldInfo info = type.GetField(name, BindingFlags.NonPublic | BindingFlags.Static); object value = info.GetValue(null); 这是一个领域。对于属性,将type.GetField更改为type.GetProperty。您也可以以类似的方式访问私有方法。尝试以下方法

是否有任何方法可以使用反射从已知类获取私有静态字段的值?

Type type = typeof(TheClass);
FieldInfo info = type.GetField(name, BindingFlags.NonPublic | BindingFlags.Static);
object value = info.GetValue(null);

这是一个领域。对于属性,将
type.GetField
更改为
type.GetProperty
。您也可以以类似的方式访问私有方法。

尝试以下方法:

Type type = typeof(MyClass);
MemberInfo[] members = type.GetMembers(BindingFlags.NonPublic | BindingFlags.Static);

我认为这应该有效。

如上所述,您可能可以使用with
::NonPublic | BindingFlags::Static
,但前提是您有权。

如果您完全信任,您应该能够:

Type t = typeof(TheClass);
FieldInfo field = t.GetField("myFieldName", BindingFlags.NonPublic | BindingFlags.Static);
object fieldValue = field.GetValue(myObject);

但是,如果您在没有完全信任的系统上运行此操作,GetField调用将失败,并且无法工作。

我想应该有人问一下这是否是一个好主意?它创建了对这个静态类的私有实现的依赖。私有实现可能会发生更改,无需向使用反射访问私有实现的人员发出任何通知


如果这两个类是要一起工作的,考虑将字段内部化,并在[Sult:InnalsVistiButo ]属性中添加协作类的组合。

在生产代码中,这通常是个坏主意。但是,它在单元测试时非常有用,因为您可以编写测试,而不必公开您希望保持私有的字段。@AVee:对于单元测试,将字段设置为
internal
并使用
InternalsVisibleTo
。更好的是,单元测试不应该测试实现,而应该测试正确的行为。通过依赖私有字段,现在如果类实现发生变化,单元测试就会中断。我同意@JohnSaunders这样的反射非常脆弱。尽管在某些情况下,它应该作为临时解决方案存在——例如,生产代码已经发布,但我需要一个特殊的实用程序来运行一些验收测试。我只能通过反射访问私有静态字段来实现这一点。此代码将更改,反射的类将被修改,以允许新实用程序在下一版本中所需的交互。值得注意的是,还可以通过
info.SetValue(null,value)
分配静态字段。我使用此答案将值设置为静态字段。MemberInfo没有
GetValue(…)
SetValue(…)
方法。成员通常是实际的方法/函数。