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下否决我,伙计们。父类是普通类还是部分类?父类是抽象类。如果基类的作者希望您能够这样做,那么他们会让字段受到保护。显然他们不想让你这么做,所以不要这么做。如果您想添加该功能,请输入功能请求。不要编写危险的脆弱代码,将依赖性放在实现细节上,而类的作者故意阻止您对其进行依赖。父类是普通类还是部分类?父类是抽象类。如果基类的作者希望您能够做到这一点,那么他们会会让这片土地受到保护。显然他们不想让你这么做,所以不要这么做。如果您想添加该功能,请输入功能需求