是否有一种方法,而不是使用反射,优雅获得一个对象的子项特性?
例如:
class A
{
public string PropA;
}
class B : A
{
public string PropB;
}
class C
{
var classB_instance = new B();
/* Only class B properties without parent so B.PropB; but no B.PropA;
}
我知道有可能用反射,但如果可以避免这种情况?
答案 0 :(得分:3)
您可以为继承的类创建一个特定的界面,比如说
interface ISpecificB {
string PropB;
}
然后创建类似
的类public class A {
public string PropA;
}
public class B: A, ISpecificB {
public string PropB;
}
并且在创建变量或从函数
返回变量时,仅将变量设置为ISpecificB
ISpecificB classB = new B();
classB.PropA // shouldn't be available
但是,classB仍然可以作为B或A进行转换,这样可以访问propA,这可能会增加解决方案的复杂性
答案 1 :(得分:0)
您可以使用protected
辅助功能修饰符:
只能通过同一个类或结构中的代码,或者从该类派生的类中访问类型或成员。
public class A
{
protected string PropA { get; set; }
}
public class B : A
{
public string PropB { get; set; }
}
public class C
{
var classB_instance = new B();
//You can't access classB_instance.PropA
}
答案 2 :(得分:0)
您可以将PropA标记为私有,请查看https://msdn.microsoft.com/en-us/library/ms173121.aspx:
私人 只能通过相同类或结构中的代码访问类型或成员。
只是一个简短的说明:大部分时间,我使用反射完全相反:访问我不被允许的东西,例如,因为它们是私有的...... ;-)反射不是“工具”隐藏一些东西,AFAIK。它会打开通常被锁上的每扇门; - )
答案 3 :(得分:0)
你能否这样做?
class A
{
private string PropA;
}
class B : A
{
public string PropB;
}
class C
{
var classB_instance = new B();
}
答案 4 :(得分:-1)
将A类的变量PropA声明为私有变量(如下面的代码所示):
class A
{
private string PropA;
}