【问题标题】:Inherit a base class in C#在 C# 中继承基类
【发布时间】:2019-07-31 15:34:12
【问题描述】:

我有一个来自另一个被引用项目的 VB 类。它是用VB编写的,函数GetCachedObject受到保护,所以我不能使用它。

我正在尝试将 VB 类用作基类,以便我可以派生和使用它的函数。

这是VB中的基类:

 Public MustInherit Class RequestLifetimeCacheBase

    Private ReadOnly _requestContext As HttpContextBase

    Public Sub New(requestContext As HttpContextBase)
        Me._requestContext = requestContext
    End Sub

    Public Sub New(controller As Controller)
        Me.New(controller.HttpContext)
    End Sub

    Protected Function GetCachedValue(Of TValue As Structure)(cacheKey As String) As TValue?
        Dim value = Me._requestContext.Items(cacheKey)
        If TypeOf value Is TValue Then
            Return DirectCast(value, TValue)
        Else
            Return Nothing
        End If
    End Function

    Protected Sub SetCachedValue(Of TValue As Structure)(cacheKey As String, value As TValue?)
        If value.HasValue Then
            Me._requestContext.Items(cacheKey) = value.Value
        Else
            Me._requestContext.Items.Remove(cacheKey)
        End If
    End Sub


    Protected Function GetCachedObject(Of TObject As Class)(cacheKey As String) As TObject
        Return TryCast(Me._requestContext.Items(cacheKey), TObject)
    End Function

    Protected Sub SetCachedObject(Of TObject As Class)(cacheKey As String, value As TObject)
        If value IsNot Nothing Then
            Me._requestContext.Items(cacheKey) = value
        Else
            Me._requestContext.Items.Remove(cacheKey)
        End If
    End Sub

End Class

我在 C# 中完成了以下操作:

public class RequestLifetimeCache : RequestLifetimeCacheBase
{

    public RequestLifetimeCache(Controller controller) : base(controller)
    {

    }

    public WebsiteDatabaseContext CustomerDatabase
    {
        get
        {
            return RequestLifetimeCacheBase.GetCachedObject("Customer database");
        }

    }

}

但我收到两个错误:

: base(controller) - 对“HttpContextBase”类型的引用声称它在“System.Web”中定义,但找不到

还有(由于受保护的功能)

return RequestLifetimeCacheBase.GetCachedObject("Customer database") - 无法通过“RequestLifetimeCacheBase”类型的限定符访问受保护的成员“RequestLifetimeCacheBase.GetCachedObject(string)”;限定符必须是“RequestLifetimeCache”类型(或派生自它

有其他方法吗?

我正在使用 .NET Core 2.2

干杯

【问题讨论】:

  • 如果您提供基类的代码 - 或者至少提供您想要覆盖的成员,会更容易。
  • 更新答案。
  • 对于您的第二个问题,您可以使用this 或完全省略对象引用来引用此方法(按照惯例,它将是this)。例如。 return this.GetCachedObject("Customer database"); 应该可以工作。
  • 关于第一个问题,我建议您没有引用声明HttpContextBase的程序集。
  • 对于第一个错误,您的项目存在问题,而另一个项目是针对不同版本的 .net 框架甚至完全不同的框架构建的(例如框架与核心)跨度>

标签: c# vb.net class inheritance base


【解决方案1】:

第一个错误与问题的继承问题无关。您可能只是缺少using 指令或参考。

对于第二个错误,这一行有两个问题:

return RequestLifetimeCacheBase.GetCachedObject("Customer database");

首先,对GetCachedObject() 的调用还需要一个类型参数,并且该类型参数必须是引用类型——不允许值类型(结构体或原语)。

其次,使用base 关键字而不是类型的名称。

结果会更像这样:

return base.GetCachedObject<WebsiteDatabaseContext>("Customer database");

【讨论】:

  • 干杯。这已经解决了第二个问题,但仍然不确定我为什么会遇到第一个问题。
  • @ZackAntonyBucci 为其他问题创建一个单独的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
  • 2012-06-16
  • 1970-01-01
  • 2017-09-05
相关资源
最近更新 更多