我可以使用反射在C#中更改私有只读继承字段吗?

像在java中我有:

Class.getSuperClass().getDeclaredFields()

我如何才能从超类中知道并设置私人领域?

我知道这是强烈不建议,但我正在测试我的应用程序,我需要模拟错误的情况下,ID是正确的,名称不正确。 但是这个ID是私人的。


是的,可以在构造函数运行后使用反射来设置只读字段的值

var fi = this.GetType()
             .BaseType
             .GetField("_someField", BindingFlags.Instance | BindingFlags.NonPublic);

fi.SetValue(this, 1);

编辑

已更新以查看直接父类型。 如果类型是通用的,这个解决方案可能会有问题。


是的你可以。

对于字段,请使用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"
}

这门课会让你做到这一点:

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;
链接地址: http://www.djcxy.com/p/3611.html

上一篇: Can I change a private readonly inherited field in C# using reflection?

下一篇: is string and String same?