Inherit Base Class 错误不包含采用 0 个参数的构造函数

Inherit Base Class Error Does Not Contain Constructor that takes 0 arguements

我正在尝试将基 class 继承到我的 class 中,这样我就可以使用它的受保护函数。基础class内置在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

VB 中的旧方法是这样创建的:

 Dim cache = New RequestLifetimeCache(Me)
        Dim cachedDatabase = cache.CustomerDatabase
        If cachedDatabase IsNot Nothing Then
            Return cachedDatabase
        End If

我正在用 C# 创建一个这样的新实例:

 public WebsiteDatabaseContext customerDB
    {
        get
        {
            RequestLifetimeCache cache = new RequestLifetimeCache();
            var cachedDB = cache.CustomerDatabase;

            return cachedDB;
        }
        set
        {

        }
    }

我的class C#代码如下:

 public class RequestLifetimeCache : RequestLifetimeCacheBase
{

    public RequestLifetimeCache()
    {

    }

    public WebsiteDatabaseContext CustomerDatabase
    {
        get
        {
            return base.GetCachedObject<WebsiteDatabaseContext>("Customer database");
        }

    }

}

但我收到错误 'RequestLifetimeCacheBase' 不包含在以下行中采用 0 个参数的构造函数:

    public RequestLifetimeCache()

我做错了什么?我是否缺少传递 HttpContext/Controller 参数或其他内容?

VB 在 .NET Framework 上,我正在研究 .NET Core

您需要传递构造函数参数。我是这样想的(我什么都不知道VB):

public class RequestLifetimeCache : RequestLifetimeCacheBase
{

    public RequestLifetimeCache(HttpContextBase ctx) : base(ctx)
    {
    }

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

    public WebsiteDatabaseContext CustomerDatabase
    {
        get
        {
            return base.GetCachedObject<WebsiteDatabaseContext>("Customer database");
        }

    }
}

作为临时措施,我不得不用 C# 重写 VB 基础 class:

 public abstract class RequestLifetimeCacheBase
 {
    private readonly HttpContext _requestContext;

    protected RequestLifetimeCacheBase(HttpContext requestContext)
    {
        _requestContext = requestContext;
    }

    protected RequestLifetimeCacheBase(Controller controller)
        : this(controller.HttpContext)
    {
    }

    #region Generic access to cached value-type data

    protected TValue? GetCachedValue<TValue>(string cacheKey)
        where TValue : struct
    {
        var value = _requestContext.Items[cacheKey];
        if (value is TValue)
        {
            return (TValue)value;
        }
        else
        {
            return null;
        }
    }

    protected void SetCachedValue<TValue>(string cacheKey, TValue? value)
        where TValue : struct
    {
        if (value.HasValue)
        {
            _requestContext.Items[cacheKey] = value.Value;
        }
        else
        {
            _requestContext.Items.Remove(cacheKey);
        }
    }

    #endregion

    #region Generic access to cached reference-type data

    protected TObject GetCachedObject<TObject>(string cacheKey)
        where TObject : class
    {
        return _requestContext.Items[cacheKey] as TObject;
    }

    protected void SetCachedObject<TObject>(string cacheKey, TObject value)
        where TObject : class
    {
        if (value != null)
        {
            _requestContext.Items[cacheKey] = value;
        }
        else
        {
            _requestContext.Items.Remove(cacheKey);
        }
    }

    #endregion
}