就像在java中我有:
Class.getSuperClass().getDeclaredFields()
我如何知道和设置超类的私有字段?
我知道强烈不推荐这样做,但我正在测试我的应用程序,我需要模拟一个错误的情况,其中 id 正确而名称不正确。但是这个 ID 是私有的。
就像在java中我有:
Class.getSuperClass().getDeclaredFields()
我如何知道和设置超类的私有字段?
我知道强烈不推荐这样做,但我正在测试我的应用程序,我需要模拟一个错误的情况,其中 id 正确而名称不正确。但是这个 ID 是私有的。
是的,可以在构造函数运行后使用反射来设置只读字段的值
var fi = this.GetType()
.BaseType
.GetField("_someField", BindingFlags.Instance | BindingFlags.NonPublic);
fi.SetValue(this, 1);
编辑
更新为查看直接父类型。如果类型是通用的,则此解决方案可能会出现问题。
这门课会让你做到:
http://csharptest.net/browse/src/Library/Reflection/PropertyType.cs
用法:
new PropertyType(this.GetType(), "_myParentField").SetValue(this, newValue);
顺便说一句,它将适用于公共/非公共领域或属性。为了便于使用,您可以像这样使用派生类PropertyValue:
new PropertyValue<int>(this, "_myParentField").Value = newValue;
是的你可以。
对于字段,请使用FieldInfo
类。该BindingFlags.NonPublic
参数允许您查看私有字段。
public class Base
{
private string _id = "hi";
public string Id { get { return _id; } }
}
public class Derived : Base
{
public void changeParentVariable()
{
FieldInfo fld = typeof(Base).GetField("_id", BindingFlags.Instance | BindingFlags.NonPublic);
fld.SetValue(this, "sup");
}
}
和一个小测试来证明它有效:
public static void Run()
{
var derived = new Derived();
Console.WriteLine(derived.Id); // prints "hi"
derived.changeParentVariable();
Console.WriteLine(derived.Id); // prints "sup"
}
就像 JaredPar 建议的那样,我做了以下事情:
//to discover the object type
Type groupType = _group.GetType();
//to discover the parent object type
Type bType = groupType.BaseType;
//now I get all field to make sure that I can retrieve the field.
FieldInfo[] idFromBaseType = bType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
//And finally I set the values. (for me, the ID is the first element)
idFromBaseType[0].SetValue(_group, 1);
谢谢大家。