无法访问嵌套类或基类成员

时间:2014-08-04 16:31:20

标签: c# .net winforms

我在这里写了一些奇怪的问题。我无法访问Account内的任何内容,除非我直接从Account.Whatever访问它。

我希望能够做到:

Account account = new Account();
account.Name...

但我不能。 intellisense中没有任何东西出现。如果我这样做,我只能访问:

Account. - 例如,Account.AccountHolder...

class Account
{
    class AccountHolder
    {
        enum Salutation
        {
            Mr,
            Mrs,
            Ms,
            Miss,
            Dr,
            Hon
        }

        struct Name
        {
            public string FirstName { get; set; }
            public string MiddleName { get; set; }
            public string LastName { get; set; }
        }

        enum Sex
        {
            Male,
            Female
        }
    }
}

我不明白发生了什么。请注意,我也尝试了所有可能的组合,但这里的内容非常错误。我已经尝试将public添加到我的帐户类。我已经尝试将public添加到我的AccountHolder类中。我尝试过使用public static等等等。

我之前从未遇到过这个问题。既然我改变了多少,为什么我会遇到同样的问题呢?

Account类位于同一winforms项目内的Account.cs文件中。

3 个答案:

答案 0 :(得分:3)

您正在尝试访问嵌套的classstructenum。它应该用嵌套类名来完成,例如Account.Name

但如果你有

class Account
{
    public struct Name
    {
        public string FirstName { get; set; }
        public string MiddleName { get; set; }
        public string LastName { get; set; }
    }

    public Name MyName {get; set;}
}

然后您可以使用MyName类的实例访问Account属性。

答案 1 :(得分:3)

  

一个真正的问题可能是:为什么在这里需要Nested Types

当没有其他类型无法重用父类型的类型时,也就是说,如果嵌套类型应公开仅适用于父类型的属性或值,则特别使用嵌套类型。否则,最好创建独立类型。

对我而言,认为您可以使用Salutation类之外的AccountHolder枚举似乎是合理的,因为帐户持有人只不过是一个法人实体,即一个真实的人或公司。

如果您的系统可以在其他地方使用Salutation,那么最好在其自己的文件中创建每个自身的枚举,并从AccountHolder类中公开属性。

<强>称谓

public enum Salutation {
    Mr
    , Mrs
    , Ms
    , Miss
    , Dr
    , Hon
}

<强>账户持有

public class AccountHolder {
    public Salutation Salutation { get; set; }
    // ...
}

在后来,人们可能也有兴趣立刻知道什么是帐户持有人?

可能是公司,个人,客户,供应商,还是其他?

那么您可能会考虑定义帐户持有者的层次结构,并使其成为最一般类别类型的属性。

<强> LegalEntity

public class LegalEntity {
    public string Name { get; set; }
}

<强>公司

public class Company : LegalEntity {
    // Some members specific to a Company here...        
}

<强>人

public class Person : LegalEntity {
    public Salutation Salutation { get; set; }
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get { return base.Name; } set { base.Name = value; } }
    // Some other members specific to a person here...
}

然后,您拥有帐户

public class Account {
    public LegalEntity AccountHolder { get; set; }
}

所以我的观点是,这里没有使用嵌套类型,具体取决于您的需求,我实际上并不知道。事实证明,AccountHolder现在可能属于LegalEntity派生的任何类型。稍后,当需要其他类型的AccountHolder时,您可能只是从LegalEntity派生,或者实际派生于其中的任何其他类型,以使其成为AccountHolderAccountHolder只是Account的属性,而不是每个类的属性。

充分使用Nested Types的一些示例:

此外,您需要公开您的嵌套类型,以便从您的课外访问它们。这并不意味着能够避免使用Parent.NestedType命名法,你不会。

除此之外,我发现您的代码没有任何问题。根据定义,嵌套类型以某种方式隐藏在另一种类型中。因此,当您希望访问它们时,您始终需要输入包含您需要访问的类型的父名称。

另外,一旦您可以访问嵌套类型,您将不得不在Account类中创建成员,以加入对这些嵌套类型实例的引用。恕我直言,这里没有使用它们的好处。但是嘿,我坚持认为,我不了解你的现实和设计背后的选择。

答案 2 :(得分:2)

这就是语言的工作方式。

您可能想要使用的是名称空间。任何嵌套类都必须完全限定其父类才能使用。如果使用命名空间,则该命名空间中的任何内容都可以在没有完全限定的情况下一起使用,并且可以通过完全限定或插入using指令在命名空间外部(在访问修饰符的范围内)使用(在这种情况下using Accounting;。)

另外,您确定要使用结构吗?值类型是不可变的,因此如果您更改该结构的任何成员,您总是创建一个全新的结构实例(通常效率显着降低)。

namespace Accounting
{
   class Account
   {
      public PersonName Name { get; set; }
      public Sexes Sex { get; set; }
      public Salutations Salutation { get; set; }
   }

   class PersonName
   {
      public string First { get;set; }
      public string Middle { get; set; }
      public string Last { get; set; }
   }

   enum Salutations : byte
   {
      Mr,
      Mrs,
      Ms,
      Miss,
      Dr,
      Hon
   }

   enum Sexes : byte
   {
      Male,
      Female
   }
}