【问题标题】:Properties in nested classes in VB.NETVB.NET 中嵌套类的属性
【发布时间】:2017-02-17 05:51:09
【问题描述】:

我一直遇到错误“如果没有类的显式实例,就无法从共享方法或共享成员初始化程序中引用类的实例成员”。我正在开发一个 VB.NET MVC 应用程序。我有一个模型,该模型具有包含在顶级类中的顶级安全属性,该类中的类应该可以使用这些属性。我的属性总是遵循这个结构:

    Private _SecurityVar = Nothing
    Public Shared Property SecurityVar
        Get
            If _SecurityVar = Nothing Then
                _SecurityVar = User.IsInRole("SecurityFunction")
            End If
            Return _SecurityVar
        End Get
        Set(value)

        End Set
    End Property

我的问题是我无法访问 _SecurityVar b/c 它不是共享的。我不希望 _SecurityVar 在我的视图中可用,只是 SecurityVar。然后,我需要从包含在此类中的类中访问这些顶级变量,例如订单列表。我不想简单地返回 User.IsInRole("SecurityFunction") 因为我会多次访问数据库;这将是非常低效的,尤其是在构建大表时。我该如何解决这个问题,有没有更好的方法?

【问题讨论】:

  • 我发现最好的方法是让子类“意识到”它们的父类。共享是一种非常松散的,在我看来,是一种糟糕的编程习惯。
  • 你的设计中的某些东西对我来说并不自然,但我想不出一个合理的方式来告诉你“为什么”而不知道更多关于它或告诉你重新设计整个事情。顺便说一句:你只需要让你Private _SecutiryVar也共享

标签: asp.net-mvc vb.net


【解决方案1】:

与其分享,不如让你的子类知道他们的出身。

在子类中添加

Private myParent as <ParentClassName>
Public Sub New(Parent as <ParentClassName>)
   MyParent = Parent
End Sum

在父类中使用创建子类

Dim Child as New <YourSubClassName>(Me)

然后当你需要子类中父类的东西时

Var = myParent.<Property Name>

如果您打算移动这些子类,您还需要将 _Parent 设为 Public 或添加一个方法,以便以后更改它。

如果您不想让子类完全访问父类,您可以将共享变量“分组”到父类中的另一个类中,然后将其传递。

【讨论】:

  • 这在我换了一些东西后起作用了。为什么它被否决了?这种方法有什么问题?
  • 我是巨魔的受害者。我的很多帖子在一分钟左右就被否决了。
【解决方案2】:

让你的私有变量也共享

Private Shared _SecurityVar = Nothing

【讨论】:

  • 这是我一直在做的,但我不希望 _SecurityVar 在我的视图中可用。
  • 它是Private,它不应该在这个类之外的任何地方都可用,即使它是共享的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多