c# - 如何约束泛型类型必须有一个采用特定参数的构造函数?

标签 c# generics constraints

我有一个包装泛型类,旨在与一组类型一起使用。这些类型由实用程序生成,并且全部派生自基类 ClientBase。虽然 ClientBase 只有一个默认构造函数,但所有生成的类型都有默认构造函数以及一个以字符串作为参数的构造函数。在包装类的构造函数中,我使用带有字符串的构造函数实例化了该类型的实例。这是一个示例代码:

public class ClientBase
{ }

public class GenericProxy<T>
    where T: ClientBase, new()
{
    T _proxy;

    public GenericProxy(string configName)
    {
        _proxy = new T(configName);    
    }
}

此代码无法编译,因为不能保证类型 T 具有采用字符串的构造函数。有没有办法在泛型类上定义约束以强制类型 T 必须具有采用字符串的构造函数?如果这是不可能的,那么处理这种情况的好方法是什么?

最佳答案

这是不可能的。我想看看 "static interfaces"来处理这个,但不要指望他们很快...

备选方案:

  • 指定一个委托(delegate)作为T的工厂
  • 指定另一个接口(interface)作为T的工厂
  • 在 T 本身上指定一个接口(interface)用于初始化(并添加一个约束,以便 T 实现该接口(interface))

前两个实际上是等价的。基本上,您会将代理类更改为如下内容:

public class GenericProxy<T>
    where T: ClientBase, new()
{
    string _configName;
    T _proxy;
    Func<string, T> _factory;

    public GenericProxy(Func<string, T> factory, string configName)
    {
        _configName = configName;
        _factory = factory;
        RefreshProxy();
    }

    void RefreshProxy() // As an example; suppose we need to do this later too
    {
        _proxy = _factory(_configName);
    }
}

(我假设您稍后会想要创建更多实例 - 否则您不妨将 T 的实例传递给构造函数。)

关于c# - 如何约束泛型类型必须有一个采用特定参数的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/853703/

相关文章:

c# - 将 json 字符串中的数组转换为列表

c# - .NET Task 实例能否在运行期间超出范围?

c# - C# datagridview 中的存储过程而不是列表框

java - 在 Java 中绑定(bind)多个类

java - 获取类类型为特定类

python - 如何创建 "at least n"约束?

c# - 通过 GetBlockBlobReference() 方法添加到 blob 文件名的容器名称

swift - 在 Swift 的通用结构上实现 Equatable 的奇怪行为

mysql - 如何重命名外键约束| MySQL 5.6、InnoDB

postgresql - postgres 中排除约束的要点