无法访问嵌套类或基类成员
我在这里写了一些奇怪的问题。 我无法访问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
添加到我的Account类中。 我已经尝试将public
添加到我的AccountHolder类中。 我尝试过使用public static
等等。
我以前从未遇到过这个问题。 既然我改变了多少,为什么我会遇到同样的问题呢?
Account
类位于同一winforms项目内的Account.cs
文件中。
一个真正的问题可能是: 为什么你在这里需要嵌套类型 ?
当没有其他类型无法重用父类型的类型时,也就是说,如果嵌套类型应公开仅适用于父类型的属性或值,则特别使用嵌套类型。 否则,最好创建独立类型。
对我来说,认为您可以在AccountHolder
类之外使用Salutation
枚举似乎是合理的,因为账户持有人只不过是一个法人实体,即真人或公司。
如果您的系统可以在其他地方使用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; } }
所以我的观点是,这里没有使用嵌套类型 ,这取决于你的需求,显然我并没有真正意识到这一点。 事实certificate, LegalEntity
现在可以是源自LegalEntity
的任何类型。 稍后,当需要另一种类型的AccountHolder
,您可以简单地从LegalEntity
派生,或LegalEntity
实际派生的任何其他类型派生到LegalEntity
,因为LegalEntity
只是Account
的属性,而不是每个class级。
充分使用Nested Types
一些示例:
- 为什么我需要使用C#嵌套类
- 为什么/何时应该在.net中使用嵌套类? 或者不应该吗?
此外,您需要公开您的嵌套类型,以便从您的课外访问它们。 这并不意味着能够避免使用Parent.NestedType命名法,你不会。
除此之外,我认为您的代码没有问题。 根据定义,嵌套类型以某种方式隐藏在另一种类型中。 因此,当您希望访问它们时,始终需要输入包含您需要访问的类型的父名称。
此外,一旦您可以访问嵌套类型,您将有义务在您的Account
类中创建成员以保存对这些嵌套类型的实例的引用。 恕我直言,这里没有使用它们的好处。 但是嘿,我坚持说,我不知道你的现实和你设计背后的选择。
您正在尝试访问嵌套的class
, struct
, enum
。 它应该使用嵌套类名称来完成,例如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;} }
然后您可以使用Account
类的实例访问MyName
属性。
这就是语言的工作方式。
你可能想要在这里使用的是命名空间。 任何嵌套类都必须完全限定其父类才能使用。 如果使用命名空间,则该命名空间中的任何内容都可以在没有完全限定的情况下一起使用,并且可以通过完全限定或插入using
指令( using Accounting;
in)在命名空间外部(在访问修饰符的范围内) 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 } }