如何约束泛型类型必须有一个带有某些参数的construtor?

Hon*_*Yan 17 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);    
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 24

这是不可能的.我想看看"静态接口"来处理这个问题,但不要期待它们很快...

备择方案:

  • 指定委托作为T的工厂
  • 指定另一个接口作为T的工厂
  • 在T本身上指定一个接口进行初始化(并添加一个约束以T实现接口)

前两个真的是等价的.基本上你将代理类改为这样的:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

(我假设您以后想要创建更多实例 - 否则您也可以将T的实例传递给构造函数.)