2014-10-20 175 views
1

我目前正在扩展一个其他人正在工作的项目,并且我一直在尝试获取受保护变量的信息。我已经尝试了几件事,但变量总是空。受保护的访问

public class AController : Controller 
{ 
    Protected Login _login {get; set;} 
} 
public class BController : AController 
{ 
    _login = login; 
} 
public class CController : AController 
{ 
    if(_login != null) 
    {  
    } 
} 

这是我认为它会工作的方式。我知道我不能做CController : BController,因为它受到保护。是否有另一种方法可以将信息从BController中提取到CController。

+0

如果代码编译并且您访问值但为空,表示在访问值之前尚未设置该值。如果你需要在课堂以外访问它,只要有可能,就将其标记为公共,如果没有,则可以通过肮脏的反射方式访问它。 – 2014-10-20 11:09:03

+0

这段代码不能编译。什么是登录(没有下划线)?然而,一个受保护的成员在所有后代中都是可见的,所以你应该能够从CController访问_login ... btw .:受保护的可能会写成小写? – HimBromBeere 2014-10-20 11:09:32

+0

您的代码不会被编译。我想你错过了这些陈述的一些方法和/或构造函数。请添加足够的代码以使代码正确。 – 2014-10-20 11:13:20

回答

3

所以你有BController的实例和CController的实例,它们都继承了AController。所以当你创建它们时,它们是两个不同的实例,并且它们中的每一个都有自己的_login变量,更改一个变量将不会改变另一个变量,除非该变量是静态的并且跨实例共享。

你应该使用静态关键字上AController的属性_login来实现你想要的结果。

然而,正确的解决方案是将login作为构造函数参数传递给BController和CController构造函数,以便它们共享相同的登录实例。

如果这些控制器是MVC控制器,为什么你需要在相同的请求上实例化它们?

+0

谢谢,静态做了诡计,就像我说我没有写这段代码,我只是在CController中扩展了一些代码。但是这些控制器是网站上不同模块的一部分,唯一相同的就是稍后添加到其他方法的登录。示例BModule(_login,OtherClass) – ZozV 2014-10-20 11:58:27

0

我不确定我在说什么,但要访问这些数据,您的对象是否需要从您的超类继承?