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

5
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;
        }
    }

我正在尝试通过employees类的实例访问BenefitPackageLevel类,例如:
Employee emp= new Employee() 
var benefitpackage= emp.BenefitPackage.BenefitPackageLevel.standard;

但是为什么我没有将 BenefitPackage 定义为静态成员,却能通过类级别访问它呢?

Employee.BenefitPackage.BenefitPackageLevel.standard

嵌套类默认是否为静态的?
3个回答

4

您并没有将其作为静态成员访问。您是通过其外部类型访问standard的。当您声明一个嵌套类型时,其范围仅限于外部类型,因此必须通过其外部类型访问它。

例如,如果您想创建BenefitPackage的实例,则应像这样执行:

var benefitPackage = new Employee.BenefitPackage();

当您想将standard作为BenefitPackageLevel枚举的值进行访问时,您必须像这样使用它:

var temp = Employee.BenefitPackage.BenefitPackageLevel.standard;

嵌套类型如果没有被声明为public,则不可从外部类型访问。

请注意,创建外部类型的实例并不会自动创建其内部类型的实例。


但是你如何访问内部枚举 BenefitPackageLevel 类型? - Mohsen
1
@Mohsen 请再仔细阅读一遍答案,dotctor 已经向您展示了如何做到这一点。 - poke

3
您的代码存在一些问题。首先,您需要对您的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;

你的代码第二段有问题。我尝试了一下,它说引用不明确。 - Mohsen
你遇到了哪个第二部分的问题?具体是什么错误? - CodingYoshi
@CodingYoshi 在一个类中,你不能同时拥有一个名为 BenefitPackage 的嵌套类和一个同名的属性。嵌套类型仍然是父类型的成员,因此你不能再拥有另一个成员(一个属性)具有相同的名称。 - poke
@poke 谢谢。我正在使用手机,所以没有编译它。你发现得真好。 - CodingYoshi
救命稻草!@CodingYoshi - Harold_Finch

1
我觉得你有些困惑。因为一个类型定义在另一个类型中,并不意味着外部类型包含任何实例信息,除非显式地定义了一个字段。
例如:
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();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接