如何在 C# 中调用 argument-type 的 parameterfull 构造函数?

How to call parameterfull constructor of argument-type in C#?

我有一个抽象 class 和一个参数完整的构造函数:

public abstract class LoggerAdapterBase<TLogger>
{
    protected readonly TLogger _logger;

    public LoggerAdapterBase(TLogger logger){
        this._logger = logger;
    }
}

在其他 class 中,我必须创建实现抽象的具体 class,但有一个问题:

public class LoggerManager<TLogger, TLoggerAdapter>: ILoggerManager<TLogger> where TLoggerAdapter: LoggerAdapterBase<TLogger>
{
    private readonly TLogger _logger;
    public LoggerManager(TLogger logger)
    {
        this._logger = logger;
    }
    public LoggerAdapterBase<TLogger> CreateLogger(Configuration configuration)
    {
        return new TLoggerAdapter(this._logger);
        //Line above says: Cannot create an instance of the variable type 'TLoggerAdapter' because it does not have the new() constraint
    }
}

我不知道为什么编译器需要 new() 约束,因为 LoggerAdapterBase 有一个我使用的构造函数,并且我已将其指定给约束,它应该看到构造函数以及来自 LoggerAdapterBase 的其他方法。这里有什么问题?

编辑

谢谢你的回答,我已经解决了。我只是创建了接口而不是抽象 class 并定义了 prop Logger。并添加了约束 new()。现在创建看起来是这样的:

return new TLoggerAdapter() { Logger = _logger };

这不是一个理想的实现,因为在从 LoggerManager 中创建实例时可能会出现 NullReferenceExceptions,并且会意外替换 prop Logger。

基本上,你不能为所欲为。以下是原因的示例:

// This is perfectly valid
public class StringLoggerAdapter : LoggerAdapterBase<string>
{
    private StringLoggerAdapter() : base("anything")
    {
    }
}

您希望 LoggerManager<string, StringLoggerAdapter>.CreateLogger 做什么?它没有可供调用的可访问构造函数,并且 存在的构造函数没有 LoggerManager 期望的参数列表。

构造函数不是继承的 - 仅仅因为基础 class 有一个带有特定参数列表的构造函数并不意味着派生的 classes 会继承。

目前无法要求类型参数具有特定的参数列表 - 除了需要无参数构造函数的 new() 约束。

有人建议 C# 团队 可能 在更高版本的 C# 中引入它,但它现在不存在,我不希望它在C# 9.