gpt4 book ai didi

c# - 如何使用反射获取私有(private)字段的值?

转载 作者:IT王子 更新时间:2023-10-29 03:53:36 27 4
gpt4 key购买 nike

我遇到了一个问题,我需要访问一个类的私有(private)字段。例如:

class MyClass 
{
private string someString;

public MyClass( string someStringValue )
{
someString = someStringValue;
}
}

如何在 MyClass 之外获取 someString 的值?

更新:

抱歉,我不能在这里使用属性,因为实际的生产代码是 protected 。我是 QA/Dev,我需要一种方法来让这些私有(private)化以编写用户验收测试。所以我无法更改生产代码。你能帮忙吗?

最佳答案

正如其他人所说,由于该字段是私有(private)的,因此您不应尝试使用普通代码获取它。唯一可以接受的情况是在单元测试期间,即便如此,您也需要有充分的理由这样做(例如将私有(private)变量设置为 null,以便命中异常 block 中的代码并对其进行测试)。

您可以使用类似下面的方法来获取该字段:

/// <summary>
/// Uses reflection to get the field value from an object.
/// </summary>
///
/// <param name="type">The instance type.</param>
/// <param name="instance">The instance object.</param>
/// <param name="fieldName">The field's name which is to be fetched.</param>
///
/// <returns>The field value from the object.</returns>
internal static object GetInstanceField(Type type, object instance, string fieldName)
{
BindingFlags bindFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic
| BindingFlags.Static;
FieldInfo field = type.GetField(fieldName, bindFlags);
return field.GetValue(instance);
}

所以你可以这样调用它:

string str = GetInstanceField(typeof(YourClass), instance, "someString") as string;

同样,在大多数情况下不应该使用它。

关于c# - 如何使用反射获取私有(private)字段的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3303126/

27 4 0
文章推荐: c# - ObservableCollection 和 Item PropertyChanged
文章推荐: javascript - 检查 ArrayBufferView 的实例?
文章推荐: javascript - 将新值分配给传递给 JavaScript 函数的对象
文章推荐: c# - 如何使用 List 的 IndexOf() 方法