如何在 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.
我有一个抽象 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.