c# - 无法实例化泛型类

标签 c# generics

我有一个接口(interface)

public interface ICrypto<T> : IDisposable
{
     ICryptoTransform GetDecryptor();

     ICryptoTransform GetEncryptor();

     T GetAlgorithm();
}

我有一个实现

public class TripleDESCryptoProvider : ICrypto<TripleDESCryptoServiceProvider>
{

    public TripleDESCryptoProvider() { }

    public ICryptoTransform GetDecryptor()
    {
        return GetAlgorithm().CreateDecryptor();
    }

    public ICryptoTransform GetEncryptor()
    {
        return GetAlgorithm().CreateEncryptor();
    }

    public TripleDESCryptoServiceProvider GetAlgorithm()
    {
     ...
    }

    public void Dispose()
    {
        throw new NotImplementedException();
    }
}

我有一个实现上面实现的类

public class CryptoWork<T> where T : ICrypto<T>, new()
{
    protected static T _keyStore;

    public static T KeyStore
    {
        get
        {
            if (_keyStore == null)
            {
                _keyStore = new T();
            }
            return _keyStore;
        }
    }

    /// <summary>
    /// Encrypt a byte array
    /// </summary>
    public string Encrypt(string input)
    {
        byte[] inputArray = UTF8Encoding.UTF8.GetBytes(input);
        using (var encryptor = KeyStore.GetEncryptor())
        {
            return Convert.ToBase64String(encryptor.TransformFinalBlock(inputArray, 0, inputArray.Length));
        }
    }

    /// <summary>
    /// Decrypt a byte array
    /// </summary>
    public string Decrypt(string input)
    {
        byte[] inputArray = Convert.FromBase64String(input);
        using (var encryptor = KeyStore.GetDecryptor())
        {
            return UTF8Encoding.UTF8.GetString(encryptor.TransformFinalBlock(inputArray, 0, inputArray.Length));
        }
    }
}

我在实例化类时遇到问题 CryptoWork<T> where T : ICrypto<T>, new() :

都不是

 var cryptoWork = new CryptoWork < ICrypto < TripleDESCryptoProvider > > ();

也不

var cryptoWork = new CryptoWork < TripleDESCryptoProvider > ();

编译。

最佳答案

您已指定:

CryptoWork<T> where T : ICrypto<T>, new()

你正在使用

new CryptoWork<TripleDESCryptoProvider>();

为此,我们需要:

TripleDESCryptoProvider : ICrypto<TripleDESCryptoProvider>

(因为 T = TripleDESCryptoProvider )

但是你有:

TripleDESCryptoProvider : ICrypto<TripleDESCryptoServiceProvider>

和一个公共(public)的无参数构造函数(你有)。选项:

  • 制作TripleDESCryptoProvider : ICrypto<TripleDESCryptoProvider>
  • 重构 API
  • 制作CryptoWork类型有 2 个泛型类型参数;一个用于 TripleDESCryptoProvider , 另一个为 TripleDESCryptoServiceProvider

关于c# - 无法实例化泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14390137/

相关文章:

c# - 有没有办法在设计时用 Visual Studio 2010 中的所有属性初始化一个对象?

c# - LINQ TO ENTITY 无法与枚举类型进行比较

java - 类从泛型父类(super class)扩展但不指定泛型类型

java - 如何在构建器模式中使用泛型

java - 根据通用类型创建对象

c# - 我应该选择 : This is a full trust application

c# - 数据绑定(bind)在后面的代码中填充的gridview

c# - 使用 DateTime 解析时如何知道时间部分是否存在

delphi - 查询未知接口(interface)类型

c# - 如何在给定 Dictionary<TKey,TValue> 类型的情况下获取 TKey 和 TValue 的类型