如何从类的实例访问嵌套类?

时间:2017-03-18 14:44:33

标签: c# .net nested

partial class Employee
{
    protected string empName;

    protected int empID = new int();

    protected float currPay;

    protected static int empAge;

    protected string empSNN;

   // these are nested classes

    public class BenefitPackage
    {
        // I want to access this class

        public enum BenefitPackageLevel
        {
            standard,Gold,Platinum
        }
        public double ComputePayDeduction()
        {
            return 125.0;
        }
    }

我试图通过员工类的实例访问 BenefitPackageLevel 类,如:

Employee emp= new Employee() 
var benefitpackage= emp.BenefitPackage.BenefitPackageLevel.standard;

但为什么虽然我没有将 BenefitPackage 定义为静态成员,但我可以通过类级别访问它,如:

Employee.BenefitPackage.BenefitPackageLevel.standard

默认情况下,嵌套类是否可能是静态的?

3 个答案:

答案 0 :(得分:4)

您不是以静态成员身份访问它。您正在通过其外部类型访问standard。声明嵌套类型时,其范围仅限于外部类型,因此您必须通过其外部类型访问它。

例如,如果您要创建BenefitPackage的实例,您应该这样做:

var benefitPackage = new Employee.BenefitPackage();

因此,当您想要standard作为BenefitPackageLevel枚举值访问时,您必须像这样使用它:

var temp = Employee.BenefitPackage.BenefitPackageLevel.standard;

外部类型无法访问嵌套类型,除非您将其公开。

请记住,当您创建外部类型的实例时,它不会创建其内部类型的实例。

答案 1 :(得分:1)

您的代码存在一些问题。首先,您需要对BenefitPackage类进行此更改:

public class BenefitPackage
{
   // Your code...

   public BenefitPackageLevel Level { get; set; }
}

然后,您需要对Employee类进行此更改并添加以下属性:

partial class Employee
{
   // Your code...

   public Employee()
   {
      this.EmoloyeeBenefitPackage = new BenefitPackage();
   }
   public BenefitPackage EmployeeBenefitPackage { get; set; }
}

现在你可以这样做:

var employee = new Employee();
employee.EmoloyeeBenefitPackage.Level = BenefitPackageLevel.Gold;
var level = employee.EmployeeBenefitPackage.Level;

答案 2 :(得分:0)

我觉得你很困惑。因为类型是在另一种类型中定义的,所以它并不意味着外部类型包含任何实例信息,除非明确定义了字段。

例如:

public class OutsideClass
{
    // Define field or properties to store nested types
    public Select Pick { get; set; }   
    public NestedClass Link { get; set; }
    // Type definitions
    public class NestedClass
    {
    }
    public enum Select
    {
        None,
        One,
        Many,
        All
    }
}

class Program
{
    static void Main(string[] args)
    {
        OutsideClass a = new OutsideClass();
        a.Pick=OutsideClass.Select.Many;
        a.Link=new OutsideClass.NestedClass();
    }
}