C# 可以修改超类的私有字段吗?

C# 可以修改超类的私有字段吗?,c#,.net,oop,private,encapsulation,C#,.net,Oop,Private,Encapsulation,我正在使用一个封闭源代码基类。我是否可以从继承类更改基类中的私有字段 假设类结构如下: public class Parent { private bool age; } public class Baby : Parent { public bool newAge{ get { return age; } } } 这当前会给您一个编译时错误: 'Parent.age' is inaccessible due

我正在使用一个封闭源代码基类。我是否可以从继承类更改基类中的私有字段

假设类结构如下:

public class Parent
{
    private bool age;
}

public class Baby : Parent  
{
    public bool newAge{
        get {
           return age;
        }
    }
}
这当前会给您一个编译时错误:

 'Parent.age' is inaccessible due to its protection level.

如何从Baby类访问“age”字段?您可以使用或类似的方法吗?

您可以尝试使用反射来访问私有字段并修改它们。比如:

typeof(Parent)
.GetField("age", BindingFlags.Instance | BindingFlags.NonPublic)
.SetValue(parent, 14);

其中
parent
parent

的一个实例,您可以尝试使用反射来访问私有字段并修改它们。比如:

typeof(Parent)
.GetField("age", BindingFlags.Instance | BindingFlags.NonPublic)
.SetValue(parent, 14);

其中
parent
parent

的一个实例。由于您无法更改父类的源代码,因此可能有两种选择:

  • 如果父类是分部类,则可以定义自己的贡献(另一个父类)来定义公共属性(它可以访问私有字段)

  • 你确实可以使用反射


  • 由于您无法更改父类的源代码,因此可能有两种选择:

  • 如果父类是分部类,则可以定义自己的贡献(另一个父类)来定义公共属性(它可以访问私有字段)

  • 你确实可以使用反射


  • 不,你做不到。除非您使用反射,例如:

    Reflection.FieldInfo fields[] = 
        myType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
    

    不,你做不到。除非您使用反射,例如:

    Reflection.FieldInfo fields[] = 
        myType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
    

    你可以使用反射。看起来是这样的:

    public class Baby : Parent
    {
        private readonly FieldInfo _ageField = typeof(Parent).GetField("age", BindingFlags.NonPublic | BindingFlags.Instance);
        public int newAge
        {
            get
            {
                return (int)_ageField.GetValue(this);
            }
            set
            {
                _ageField.SetValue(this, value);
            }
        }
    } 
    

    如果它是由第三方提供的,没有什么可以阻止他们更改它、重命名它、删除它。这是
    private
    的要点之一。请记住,它可能是私人的,因为有一个原因。在你不该做的地方修修补补可能会导致意想不到的结果

    您可以使用反射。看起来是这样的:

    public class Baby : Parent
    {
        private readonly FieldInfo _ageField = typeof(Parent).GetField("age", BindingFlags.NonPublic | BindingFlags.Instance);
        public int newAge
        {
            get
            {
                return (int)_ageField.GetValue(this);
            }
            set
            {
                _ageField.SetValue(this, value);
            }
        }
    } 
    
    如果它是由第三方提供的,没有什么可以阻止他们更改它、重命名它、删除它。这是
    private
    的要点之一。请记住,它可能是私人的,因为有一个原因。在你不该做的地方修修补补可能会导致意想不到的结果

    您可以通过反射修改这些值。话虽如此,你可能不应该

    私有字段、属性和方法都不是由类的契约明确保证的。如果这个第三方API是可靠的,他们提供的公共合同将不会改变(但它们可以很容易地增长)

    不保证每个版本的专用部件和内部部件都相同。通过将您的代码与代码的这些部分相耦合,您已经为将来的版本带来了很多风险。如果你对这种风险没有意见(而且有很好的文件证明你为什么要这样做),那么无论如何,你都应该反思一下

    如果您确实这样做了,我建议您使用所有消费代码都使用的适配器类,而不是这个第三方API。使用适配器模式,只有一个类需要更改以响应第三部分API的更改。

    您可以通过反射修改这些值。话虽如此,你可能不应该

    私有字段、属性和方法都不是由类的契约明确保证的。如果这个第三方API是可靠的,他们提供的公共合同将不会改变(但它们可以很容易地增长)

    不保证每个版本的专用部件和内部部件都相同。通过将您的代码与代码的这些部分相耦合,您已经为将来的版本带来了很多风险。如果你对这种风险没有意见(而且有很好的文件证明你为什么要这样做),那么无论如何,你都应该反思一下


    如果您确实这样做了,我建议您使用所有消费代码都使用的适配器类,而不是这个第三方API。对于适配器模式,只有一个类需要更改以响应第三部分API的更改。

    他不能:
    封闭源代码基类
    下载者,对不起,我还没有看到问题中的第一句话。我给出了另一个选项,所以请重新考虑投票。只有当他拥有父类的源时,分部类才有用,我可能只是建议首先将字段更改为protected。记住,分部类是一个编译器特性,运行时完全不知道它。哦,你说得对。只能在同一程序集中定义分部类。谢谢你提供的信息。各位,不要在0以下否决我。他不能:
    封闭源代码基类
    否决票,对不起,我还没有看到问题中的第一句话。我给出了另一个选项,所以请重新考虑投票。只有当他拥有父类的源时,分部类才有用,我可能只是建议首先将字段更改为protected。记住,分部类是一个编译器特性,运行时完全不知道它。哦,你说得对。只能在同一程序集中定义分部类。谢谢你提供的信息。别在0下否决我,伙计们。父类是普通类还是部分类?父类是抽象类。如果基类的作者希望您能够这样做,那么他们会让字段受到保护。显然他们不想让你这么做,所以不要这么做。如果您想添加该功能,请输入功能请求。不要编写危险的脆弱代码,将依赖性放在实现细节上,而类的作者故意阻止您对其进行依赖。父类是普通类还是部分类?父类是抽象类。如果基类的作者希望您能够做到这一点,那么他们会会让这片土地受到保护。显然他们不想让你这么做,所以不要这么做。如果您想添加该功能,请输入功能需求